Wat u hier lijkt te willen, is een doorlopend gemiddelde van eerdere M-records vanaf het huidige record en we moeten het huidige record selecteren als de kolomwaarde van het huidige record groter is dan het lopende gemiddelde.
Hier is mijn poging daartoe:
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 is een telling van eerdere records die in aanmerking komen voor het vinden van het lopende gemiddelde.
Hier is de code op SQL Fiddle
[EDIT]:
Hier is een andere oplossing die volgens mij efficiënter zou moeten zijn dan gecorreleerde zoekopdrachten.
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
Hier heb ik eenvoudige inner join
gebruikt om het lopend gemiddelde te berekenen en opnieuw met inner join, heb rijen geselecteerd met een kolomwaarde die groter is dan gemiddeld.
Hier is de code op SQL Fiddle
Laat het me weten of het efficiënt is gebleken.