sql >> Databáze >  >> RDS >> Mysql

jak získat horní trend s avg mysql

Zdá se, že zde chcete klouzavý průměr minulých M záznamů počínaje aktuálním záznamem a pokud je hodnota sloupce aktuálního záznamu větší než průběžný průměr, musíme vybrat aktuální záznam.

Zde je můj pokus o to:

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 je počet minulých záznamů, které je třeba vzít v úvahu při hledání průběžného průměru.

Zde je kód na SQL Fiddle

[EDITACE]:

Zde je další řešení, které by podle mě mělo být efektivnější než korelovaný dotaz.

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

Zde jsem použil jednoduché inner join pro výpočet průběžného průměru a znovu s vnitřním spojením vyberte řádky, které mají hodnotu sloupce větší než průměr.

Zde je kód na SQL Fiddle

Dejte mi vědět, zda se to ukázalo jako efektivní.




  1. UTF-8:zobrazuje se správně v databázi, ale ne v HTML navzdory znakové sadě utf-8

  2. Hledání funkční závislosti

  3. Výchozí chování automatického potvrzení připojení JDBC

  4. Jak by se dal tento dotaz vylepšit?