La mia reazione iniziale è stata quella di utilizzare LIMIT per limitare la media a 5 risultati, il che mi ha portato a suggerire:
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;
Ma è chiaro che ciò limita la media ai 5 lavori più recenti e non ai 5 lavori più recenti per host.
Sembra difficile utilizzare LIMIT per limitare la media, senza utilizzare una sorta di stored procedure. Questo mi ha portato a considerare di assegnare a ciascun lavoro un ordine di completamento per host, o posizione, utilizzando una variabile mysql.
Questo non è testato, ma la teoria illustrata dovrebbe essere un buon punto di partenza:
Innanzitutto, dovremmo assegnare a ogni lavoro una posizione in base al suo 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;
Dopo aver stabilito la posizione, basta selezionare la funzione di aggregazione, limitando i risultati alle prime 5 posizioni:
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;
Per favore fatemi sapere se questo funziona per voi, o se ci sono più aspetti che non ho considerato. Questo è un problema intrigante.