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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算MySQL列中不同值的移动平均值相关的知识,希望对你有一定的参考价值。

我有一个这样的数据集:

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
答案

您缺少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

以上是关于计算MySQL列中不同值的移动平均值的主要内容,如果未能解决你的问题,请参考以下文章

如何计算另一列中特定值的列的平均值?

使用最后 n 个值的平均值或中值填充数据框不同列中的缺失值

R中前三个值的移动平均值

计算 2 行 2 个不同表的平均值

计算一系列行的平均值

TSQL - 列中所有非零值的平均值