आप यहां जो चाहते हैं वह वर्तमान रिकॉर्ड से शुरू होने वाले पिछले एम रिकॉर्ड्स का औसत चल रहा है और यदि वर्तमान रिकॉर्ड का कॉलम मान चल रहे औसत से अधिक है तो हमें वर्तमान रिकॉर्ड का चयन करना होगा।
इसके लिए मेरा प्रयास यह है:
SET @M := 2;
SELECT * FROM
(
SELECT (@rownumber:= @rownumber + 1) AS rn, yt.*
FROM your_table yt,(SELECT @rownumber:= 0) nums
ORDER BY name, id
) a
WHERE a.var1 >
(
SELECT avg(b.var1)
FROM
(
SELECT (@rownumber:= @rownumber + 1) AS rn, yt.*
FROM your_table yt,(SELECT @rownumber:= 0) nums
ORDER BY name, id
) b
WHERE b.rn > a.rn - @M AND b.rn <= a.rn
)
@M पिछले रिकॉर्ड की गिनती है जिसे रनिंग एवरेज खोजने के लिए माना जाता है।
यहां SQL Fiddle पर कोड दिया गया है।
[संपादित करें]:
यहाँ एक और समाधान है जो मेरे अनुसार सहसंबद्ध क्वेरी की तुलना में अधिक कुशल होना चाहिए।
SET @M := 2;
SELECT a.* FROM
(
SELECT (@rownumber:= @rownumber + 1) AS rn, yt.*
FROM your_table yt,(SELECT @rownumber:= 0) nums
ORDER BY name, id
) a
JOIN
(
SELECT b.name, b.rn, AVG(c.var1) AS av
FROM
(
SELECT (@rownumber1:= @rownumber1 + 1) AS rn, yt.*
FROM your_table yt,(SELECT @rownumber1:= 0) nums
ORDER BY name, id
) b
JOIN
(
SELECT (@rownumber2:= @rownumber2 + 1) AS rn, yt.*
FROM your_table yt,(SELECT @rownumber2:= 0) nums
ORDER BY name, id
) c
ON b.name = c.name
AND c.rn > (b.rn - @M) AND c.rn <= b.rn
GROUP BY b.name,b.rn
) runningavg
ON a.name = runningavg.name
AND a.rn = runningavg.rn
AND a.var1 > runningavg.av
यहाँ मैंने सरल inner join
. का उपयोग किया है रनिंग एवरेज की गणना करने के लिए और फिर से इनर जॉइन के साथ उन पंक्तियों का चयन किया है जिनका कॉलम वैल्यू औसत से अधिक है।
यह SQL Fiddle पर कोड है।
मुझे बताएं कि क्या यह कारगर साबित हुआ।