sql >> Database >  >> RDS >> Mysql

hoe je een hogere trend krijgt met avg mysql

Wat u hier lijkt te willen, is een doorlopend gemiddelde van eerdere M-records vanaf het huidige record en we moeten het huidige record selecteren als de kolomwaarde van het huidige record groter is dan het lopende gemiddelde.

Hier is mijn poging daartoe:

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 is een telling van eerdere records die in aanmerking komen voor het vinden van het lopende gemiddelde.

Hier is de code op SQL Fiddle

[EDIT]:

Hier is een andere oplossing die volgens mij efficiënter zou moeten zijn dan gecorreleerde zoekopdrachten.

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

Hier heb ik eenvoudige inner join gebruikt om het lopend gemiddelde te berekenen en opnieuw met inner join, heb rijen geselecteerd met een kolomwaarde die groter is dan gemiddeld.

Hier is de code op SQL Fiddle

Laat het me weten of het efficiënt is gebleken.




  1. Hoe kan ik een type definiëren in oracle11g dat verwijst naar een verzameling van dat type?

  2. ORA-01002:ophalen uit de volgorde C++

  3. Aantal bepaalde dagen van de week (weekend) ophalen uit interval in PostgreSQL

  4. Waarden van bindparameters ophalen uit Oracle JDBC PreparedStatement-object