Min första reaktion var att använda LIMIT för att begränsa genomsnittet till 5 resultat, vilket fick mig att föreslå:
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 är tydligt att detta begränsar genomsnittet till de senaste fem jobben och inte de senaste fem jobben per värd.
Det verkar svårt att använda LIMIT för att begränsa genomsnittet, utan att använda någon form av lagrad procedur. Detta fick mig att överväga att tilldela varje jobb en slutförandeorder eller position per värd med hjälp av en mysql-variabel.
Detta är oprövat, men teorin som den illustrerar borde vara en bra utgångspunkt:
Först bör vi tilldela varje jobb en position baserat på dess värd:
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 fastställt positionen väljer du bara sammanställningsfunktionen, vilket begränsar resultaten till de fem bästa positionerna:
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;
Meddela mig om detta fungerar för dig eller om det finns fler aspekter som jag inte har beaktat. Det här är ett spännande problem.