如何用avg mysql获得上限趋势

时间:2014-03-03 15:12:11

标签: mysql sql

我有一个如下的Mysql数据库: id,name,col1

我希望找到所有行:行的col1值大于最大5行的avrage值 例如,如果我有50行,并且如果行#20已经获得,则行#20,#19,#18,#17,#16的col1值的有效值应该小于行#的col1的值20,依此类推...... 提前谢谢。

1 个答案:

答案 0 :(得分:1)

你现在想要的是从当前记录开始运行过去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

的代码

让我知道它是否有效。