计算MySQL列中不同值的移动平均值

问题描述 投票:1回答:1

我有一个这样的数据集:

team   date        score
A      2011-05-01    50
A      2012-05-02    54
A      2013-05-03    51
A      2014-05-04    49
A      2015-05-05    59
B      2012-05-03    30
B      2013-05-04    35
B      2014-05-05    39
B      2015-05-06    47
B      2016-05-07    50

我想添加另一列MA3,在其中我可以计算最近3天的分数移动平均值。棘手的一点是计算每个团队的MA。最终结果应该是这样的:

team   date         score   MA3
A      2011-05-01    50    null
A      2012-05-02    54    null
A      2013-05-03    51    null
A      2014-05-04    49    51.66
A      2015-05-05    59    51.33
B      2012-05-03    30    null
B      2013-05-04    35    null
B      2014-05-05    39    null
B      2015-05-06    47    34.66
B      2016-05-07    50    40.33

如果那是一个团队,我会继续做:

SELECT team, 
       year,
       AVG(score) OVER (ORDER BY date ASC ROWS 3 PRECEDING) AS MA3
FROM   table
mysql moving-average
1个回答
0
投票

您缺少PARTITION BY子句:

SELECT team, 
       year,
       AVG(score) OVER (
         PARTITION BY team
         ORDER BY date ASC ROWS 3 PRECEDING
       ) AS MA3
FROM   table

请注意,无论窗口大小如何,都将始终进行平均计算。如果您希望窗口大小小于3,则平均值为null,则可以这样操作:

SELECT team, 
       year,
       CASE 
         WHEN count(*) OVER w <= 3 THEN null 
         ELSE AVG(score) OVER w
       END AS MA3
FROM   table
WINDOW w AS (PARTITION BY team ORDER BY date ASC ROWS 3 PRECEDING)

dbfiddle

© www.soinside.com 2019 - 2024. All rights reserved.