sql >> Databáze >  >> RDS >> Mysql

MySQL Limit, Group a AVG Query

Moje počáteční reakce byla použít LIMIT k omezení průměru na 5 výsledků, což mě vedlo k návrhu:

select a.host, avg(a.execution_time) from (select id, execution_time, host from jobs order by id desc limit 5) a group by a.host;

Ale je jasné, že to omezuje průměr na posledních 5 úloh, a ne na posledních 5 úloh na hostitele.

Zdá se obtížné použít LIMIT k omezení průměru bez použití nějaké uložené procedury. To mě vedlo k úvaze přiřadit každé úloze objednávku dokončení nebo pozici pro hostitele pomocí proměnné mysql.

Toto není testováno, ale teorie, kterou ilustruje, by měla být dobrým výchozím bodem:

Nejprve bychom měli každé práci přiřadit pozici podle jejího hostitele:

select
  host, 
  execution_time,
  @current_pos := if (@current_host = host, @current_pos, 0) + 1 as position,
  @current_host := host
from
  (select @current_host := null, @current_pos := 0) set_pos,
  jobs
order by
  host,
  id desc;

Po vytvoření pozice stačí vybrat agregační funkci a omezit výsledky na prvních 5 pozic:

select
  jt.host,
  avg(jt.execution_time)
from
  (
  select
    host, 
    execution_time,
    @current_pos := if (@current_host = host, @current_pos, 0) + 1 as position,
    @current_host := host
  from
    (select @current_host := null, @current_pos := 0) set_pos,
    jobs
  order by
    host,
    id desc
  ) jt
where
  jt.position <= 5
group
  by host;

Dejte mi prosím vědět, jestli to pro vás funguje, nebo jestli existuje více aspektů, které jsem nezvážil. Toto je zajímavý problém.



  1. odborová klauzule v sql

  2. Jak poslat výsledky dotazu e-mailem jako přílohu v SQL Server (T-SQL)

  3. Proč je připojení MySQL blokováno mnoha chybami připojení?

  4. Filtrujte studenty, kteří ještě neprošli nějakým předmětem