Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

como obter tendência superior com avg mysql


O que você parece querer aqui é a média de execução dos registros M anteriores a partir do registro atual e precisamos selecionar o registro atual se o valor da coluna do registro atual for maior que a média de execução.

Aqui está a minha tentativa para isso:
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 é a contagem de registros anteriores a serem considerados para encontrar a média de execução.

Aqui está o código em SQL Fiddle

[EDITAR]:

Aqui está outra solução que, segundo mim, deve ser mais eficiente que a consulta correlacionada.
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

Aqui eu usei simples inner join para calcular a média de execução e novamente com junção interna, selecione as linhas com valor de coluna maior que a média.

Aqui está o código em SQL Fiddle

Deixe-me saber se provou ser eficiente.