我最初的反應是使用極限平均限制爲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個工作崗位。
似乎很難使用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;
請讓我知道這是否適用於您,或者如果還有更多我沒有考慮過的問題。這是一個有趣的問題。
一個小問題;你遇到了同樣的問題,嵌套查詢將只返回5個主機。 – Rob 2010-07-26 12:40:11
是的,我發現問題比我最初想象的更復雜。我已經更新了我的解決方案,試圖解決這個問題。 – 2010-07-26 14:16:25
不錯!完美適合我。 – Rob 2010-07-27 14:56:18