我有一个如下的Mysql数据库: id,name,col1
我希望找到所有行:行的col1值大于最大5行的avrage值 例如,如果我有50行,并且如果行#20已经获得,则行#20,#19,#18,#17,#16的col1值的有效值应该小于行#的col1的值20,依此类推...... 提前谢谢。
答案 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
的代码让我知道它是否有效。