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.