Първоначалната ми реакция беше да използвам LIMIT, за да огранича средната стойност до 5 резултата, което ме накара да предложа:
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;
Но е ясно, че това ограничава средната стойност до най-новите 5 задачи, а не най-новите 5 задачи на хост.
Изглежда трудно да се използва LIMIT за ограничаване на средната стойност, без да се използва някакъв вид съхранена процедура. Това ме накара да обмисля присвояването на всяка задача на ред за завършване или позиция за всеки хост, използвайки променлива на mysql.
Това не е тествано, но теорията, която илюстрира, трябва да бъде добра отправна точка:
Първо, трябва да присвоим на всяко задание позиция въз основа на неговия хост:
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;
След като установите позицията, просто изберете обобщената функция, ограничавайки резултатите до първите 5 позиции:
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;
Моля, уведомете ме дали това работи за вас или има други аспекти, които не съм разгледал. Това е интригуващ проблем.