Mysql
 sql >> Base de données >  >> RDS >> Mysql

comment obtenir une tendance supérieure avec avg mysql

Ce que vous semblez vouloir ici, c'est la moyenne mobile des enregistrements M passés à partir de l'enregistrement actuel et nous devons sélectionner l'enregistrement actuel si la valeur de la colonne de l'enregistrement actuel est supérieure à la moyenne mobile.

Voici ma tentative :

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 est le nombre d'enregistrements passés à prendre en compte pour trouver la moyenne courante.

Voici le code sur SQL Fiddle

[MODIFIER] :

Voici une autre solution qui selon moi devrait être plus efficace que la requête corrélée.

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

Ici, j'ai utilisé une simple inner join pour calculer la moyenne courante et encore une fois avec la jointure interne, vous avez sélectionné les lignes dont la valeur de colonne est supérieure à la moyenne.

Voici le code sur SQL Fiddle

Faites-moi savoir si cela s'est avéré efficace.