Mysql
 sql >> Database >  >> RDS >> Mysql

come ottenere una tendenza superiore con avg mysql

Quello che sembra volere qui è la media corrente dei record M passati a partire dal record corrente e dobbiamo selezionare il record corrente se il valore della colonna del record corrente è maggiore della media corrente.

Ecco il mio tentativo:

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 è il conteggio dei record passati da considerare per trovare la media corrente.

Ecco il codice in SQL Fiddle

[MODIFICA]:

Ecco un'altra soluzione che secondo me dovrebbe essere più efficiente della query correlata.

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

Qui ho usato un semplice inner join per calcolare la media corrente e di nuovo con inner join sono state selezionate righe con un valore di colonna maggiore della media.

Ecco il codice in SQL Fiddle

Fammi sapere se si è rivelato efficiente.