Mysql
 sql >> Datenbank >  >> RDS >> Mysql

wie man mit avg mysql den oberen trend erhält

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.