Was Sie hier zu wollen scheinen, ist der laufende Durchschnitt vergangener M-Datensätze, beginnend mit dem aktuellen Datensatz, und wir müssen den aktuellen Datensatz auswählen, wenn der Spaltenwert des aktuellen Datensatzes größer als der laufende Durchschnitt ist.
Hier ist mein Versuch dazu:
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 ist die Anzahl der vergangenen Aufzeichnungen, die für die Ermittlung des laufenden Durchschnitts berücksichtigt werden sollen.
Hier ist der Code unter SQL Fiddle
[BEARBEITEN]:
Hier ist eine andere Lösung, die meiner Meinung nach effizienter sein sollte als korrelierte Abfragen.
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 habe ich einen einfachen inner join
verwendet um den laufenden Durchschnitt zu berechnen und wieder mit Inner Join Zeilen auszuwählen, deren Spaltenwert größer als der Durchschnitt ist.
Hier ist der Code unter SQL Fiddle
Lassen Sie mich wissen, ob es sich als effizient erwiesen hat.