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

hvordan man får øvre trend med avg mysql

Det, du ser ud til at ønske dig her, er løbende gennemsnit af tidligere M poster startende fra den aktuelle post, og vi skal vælge den aktuelle post, hvis den nuværende posts kolonneværdi er større end det løbende gennemsnit.

Her er mit forsøg på 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 er antallet af tidligere rekorder, der skal tages i betragtning for at finde løbende gennemsnit.

Her er koden på SQL Fiddle

[EDIT]:

Her er en anden løsning, som ifølge mig burde være mere effektiv end korreleret forespørgsel.

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

Her har jeg brugt simpel inner join for at beregne løbende gennemsnit og igen med indre sammenføjning skal du vælge rækker, der har kolonneværdi større end gennemsnittet.

Her er koden på SQL Fiddle

Fortæl mig, om det viste sig at være effektivt.




  1. Hvordan definerer jeg en ARRAY-kolonne i en Sequel Postgresql-migrering?

  2. Sådan formateres SQLite-resultater som en tabel

  3. SQL Server Join Estimation ved hjælp af Histogram Coarse Alignment

  4. Oracle eksekveringsplaner ved brug af LIKE-operatoren med en DETERMINISTISK funktion