Reaksi awal saya adalah menggunakan LIMIT untuk membatasi rata-rata menjadi 5 hasil, yang membuat saya menyarankan:
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;
Namun jelas bahwa ini membatasi rata-rata untuk 5 pekerjaan terbaru, dan bukan 5 pekerjaan terbaru per host.
Tampaknya sulit menggunakan LIMIT untuk membatasi rata-rata, tanpa menggunakan semacam prosedur tersimpan. Hal ini membuat saya mempertimbangkan untuk menetapkan setiap pekerjaan urutan penyelesaian per-host, atau posisi, menggunakan variabel mysql.
Ini belum teruji, tetapi teori yang diilustrasikan harus menjadi titik awal yang baik:
Pertama, kita harus menetapkan posisi masing-masing pekerjaan berdasarkan host-nya:
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;
Setelah menetapkan posisi, cukup pilih fungsi agregat, batasi hasil ke 5 posisi teratas:
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;
Tolong beri tahu saya jika ini berhasil untuk Anda, atau jika ada lebih banyak aspek yang belum saya pertimbangkan. Ini adalah masalah yang menarik.