Mijn eerste reactie was om LIMIT te gebruiken om het gemiddelde te beperken tot 5 resultaten, wat me ertoe bracht het volgende voor te stellen:
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;
Maar het is duidelijk dat dit het gemiddelde beperkt tot de meest recente 5 jobs, en niet de meest recente 5 jobs per host.
Het lijkt moeilijk om LIMIT te gebruiken om het gemiddelde te beperken, zonder een soort opgeslagen procedure te gebruiken. Dit bracht me ertoe om aan elke taak een voltooiingsvolgorde of positie per host toe te wijzen met behulp van een mysql-variabele.
Dit is niet getest, maar de theorie die het illustreert zou een goed uitgangspunt moeten zijn:
Eerst moeten we elke taak een positie toewijzen op basis van de host:
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;
Na het vaststellen van de positie, selecteert u gewoon de aggregatiefunctie, waarbij de resultaten worden beperkt tot de top 5 posities:
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;
Laat het me weten als dit voor u werkt, of als er meer aspecten zijn waar ik niet aan heb gedacht. Dit is een intrigerend probleem.