Mysql
 sql >> база данни >  >> RDS >> Mysql

как да получите горна тенденция с avg mysql

Това, което изглежда искате тук, е текуща средна стойност на минали M записи, започвайки от текущия запис и трябва да изберем текущия запис, ако стойността на колоната на текущия запис е по-голяма от текущата средна стойност.

Ето моя опит за това:

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 е броят на минали записи, които трябва да се вземат предвид за намиране на текуща средна стойност.

Ето кода в SQL Fiddle

[РЕДАКТИРАНЕ]:

Ето друго решение, което според мен трябва да е по-ефективно от корелираната заявка.

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

Тук използвах просто inner join за изчисляване на текуща средна стойност и отново с вътрешно свързване са избрали редове, чиято стойност на колона е по-голяма от средната.

Ето кода в SQL Fiddle

Кажете ми дали се оказа ефективно.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво означава професионален работен процес, създаващ база данни с помощта на Hibernate в Eclipse?

  2. Качването на изображения в PHP tot MySQL не работи

  3. MYSQL изтрива всички резултати с count(*)=1

  4. Избор на поръчка въз основа на резултатите от присъединяването (сортиране на разговори при последното изпратено съобщение)

  5. Правилно ли е да се сканира таблица в MySQL с помощта на SELECT * .. LiMIT start, count без клауза ORDER BY?