मेरी प्रारंभिक प्रतिक्रिया औसत को 5 परिणामों तक सीमित रखने के लिए LIMIT का उपयोग करने की थी, जिसके कारण मैंने सुझाव दिया:
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;
कृपया मुझे बताएं कि क्या यह आपके लिए काम करता है, या यदि और भी पहलू हैं जिन पर मैंने विचार नहीं किया है। यह एक पेचीदा समस्या है।