Phản ứng ban đầu của tôi là sử dụng LIMIT để giới hạn mức trung bình ở 5 kết quả, điều này khiến tôi đề xuất:
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;
Nhưng rõ ràng là điều này giới hạn mức trung bình cho 5 công việc gần đây nhất chứ không phải 5 công việc gần đây nhất trên mỗi máy chủ.
Có vẻ như khó sử dụng LIMIT để hạn chế mức trung bình mà không sử dụng một số loại thủ tục được lưu trữ. Điều này khiến tôi phải cân nhắc việc chỉ định mỗi công việc một thứ tự hoàn thành cho mỗi máy chủ lưu trữ hoặc vị trí, bằng cách sử dụng biến mysql.
Điều này chưa được kiểm chứng, nhưng lý thuyết mà nó minh họa phải là một điểm khởi đầu tốt:
Đầu tiên, chúng ta nên chỉ định mỗi công việc một vị trí dựa trên máy chủ của nó:
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;
Sau khi thiết lập vị trí, chỉ cần chọn chức năng tổng hợp, giới hạn kết quả ở 5 vị trí hàng đầu:
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;
Vui lòng cho tôi biết nếu điều này phù hợp với bạn, hoặc nếu có nhiều khía cạnh khác mà tôi chưa xem xét. Đây là một vấn đề hấp dẫn.