Moją pierwszą reakcją było użycie LIMIT, aby ograniczyć średnią do 5 wyników, co skłoniło mnie do zasugerowania:
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;
Ale jasne jest, że ogranicza to średnią do ostatnich 5 zadań, a nie ostatnich 5 zadań na hosta.
Wydaje się, że trudno jest użyć LIMIT do ograniczenia średniej bez użycia jakiejś procedury składowanej. To skłoniło mnie do rozważenia przypisania każdemu zadaniu kolejności ukończenia na host lub pozycji za pomocą zmiennej mysql.
Nie jest to testowane, ale teoria, którą ilustruje, powinna być dobrym punktem wyjścia:
Najpierw powinniśmy przypisać każdej pracy stanowisko w oparciu o hosta:
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;
Po ustaleniu pozycji wystarczy wybrać funkcję agregującą, ograniczającą wyniki do 5 najwyższych pozycji:
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;
Daj mi znać, czy to działa dla Ciebie, czy jest więcej aspektów, których nie brałem pod uwagę. To intrygujący problem.