Det, du ser ud til at ønske dig her, er løbende gennemsnit af tidligere M poster startende fra den aktuelle post, og vi skal vælge den aktuelle post, hvis den nuværende posts kolonneværdi er større end det løbende gennemsnit.
Her er mit forsøg på det:
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 er antallet af tidligere rekorder, der skal tages i betragtning for at finde løbende gennemsnit.
Her er koden på SQL Fiddle
[EDIT]:
Her er en anden løsning, som ifølge mig burde være mere effektiv end korreleret forespørgsel.
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
Her har jeg brugt simpel inner join
for at beregne løbende gennemsnit og igen med indre sammenføjning skal du vælge rækker, der har kolonneværdi større end gennemsnittet.
Her er koden på SQL Fiddle
Fortæl mig, om det viste sig at være effektivt.