Това, което изглежда искате тук, е текуща средна стойност на минали M записи, започвайки от текущия запис и трябва да изберем текущия запис, ако стойността на колоната на текущия запис е по-голяма от текущата средна стойност.
Ето моя опит за това:
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
Кажете ми дали се оказа ефективно.