Ma première réaction a été d'utiliser LIMIT pour restreindre la moyenne à 5 résultats, ce qui m'a amené à suggérer :
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;
Mais force est de constater que cela limite la moyenne aux 5 jobs les plus récents, et non aux 5 jobs les plus récents par host.
Il semble difficile d'utiliser LIMIT pour restreindre la moyenne, sans utiliser une sorte de procédure stockée. Cela m'a amené à envisager d'attribuer à chaque travail un ordre d'exécution par hôte, ou une position, à l'aide d'une variable mysql.
Ceci n'a pas été testé, mais la théorie qu'il illustre devrait être un bon point de départ :
Tout d'abord, nous devons attribuer à chaque tâche une position en fonction de son hôte :
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;
Après avoir établi la position, sélectionnez simplement la fonction d'agrégation, en limitant les résultats aux 5 premières positions :
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;
Veuillez me faire savoir si cela fonctionne pour vous, ou s'il y a d'autres aspects que je n'ai pas pris en compte. C'est un problème intrigant.