Min første reaktion var at bruge LIMIT til at begrænse gennemsnittet til 5 resultater, hvilket fik mig til at foreslå:
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;
Men det er klart, at dette begrænser gennemsnittet til de seneste 5 jobs og ikke de seneste 5 jobs pr. vært.
Det synes svært at bruge LIMIT til at begrænse gennemsnittet uden at bruge en form for lagret procedure. Dette fik mig til at overveje at tildele hvert job en fuldførelsesordre eller stilling pr. vært ved hjælp af en mysql-variabel.
Dette er uafprøvet, men den teori, det illustrerer, burde være et godt udgangspunkt:
Først bør vi tildele hvert job en stilling baseret på dens vært:
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;
Når du har etableret positionen, skal du blot vælge den samlede funktion, hvilket begrænser resultaterne til de øverste 5 positioner:
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;
Fortæl mig venligst, om dette virker for dig, eller hvis der er flere aspekter, jeg ikke har overvejet. Dette er et spændende problem.