sql >> Databasteknik >  >> RDS >> Mysql

hur man får övre trend med avg mysql

Vad du verkar vilja ha här är löpande medelvärde av tidigare M poster med början från nuvarande post och vi måste välja den aktuella posten om aktuell posts kolumnvärde är större än löpande medelvärde.

Här är mitt försök till det:

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 är antalet tidigare rekord som ska beaktas för att hitta löpande medelvärde.

Här är koden på SQL Fiddle

[EDIT]:

Här är en annan lösning som enligt mig borde vara mer effektiv än korrelerad fråga.

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

Här har jag använt enkel inner join för att beräkna löpande medelvärde och igen med inre koppling har du valt rader som har ett kolumnvärde som är större än genomsnittet.

Här är koden på SQL Fiddle

Låt mig veta om det visade sig vara effektivt.




  1. Är MS-SQL OCH/ELLER villkorligt (utför kortslutningsutvärdering)?

  2. Om användbarheten av uttrycksindex

  3. Vilket är effektivare smallint eller karaktär(10)?

  4. [A]MySql.Data.MySqlClient.MySqlConnection kan inte castas till [B]MySql.Data.MySqlClient.MySqlConnection