如何计算MySQL中每周移动4周的平均值

时间:2012-07-24 22:55:06

标签: mysql

我有一张这样的桌子。

    
    count | date
    ------------------
     1     2012-01-01   
     4     2012-01-01   
     5     2012-01-02
    12     2012-01-03
     7     2012-01-04
     4     2012-01-05
    19     2012-01-06
     1     2012-01-07
     etc...

我正在寻找一种方法来计算每周过去4周内每周的平均人数。

结果应该是......

    
    avg | yearweek
    ------------------
     3     201201   
     5     201202   
     6     201203
     1     201204
     11    201205
     3     201206
    18     201207
    12     201208
     etc...

......每年每周是过去4周的每周平均值。

获得每周平均值很简单,但我如何在过去的4周内获得平均值?然后我该如何做到滚动平均?我最好只是在代码中执行此操作吗?

1 个答案:

答案 0 :(得分:0)

虽然您可以在应用程序的代码中执行此操作,但如果您确实需要在SQL中执行此操作,则可以先创建一个按周聚合的结果表,然后将其连接到自身以获得为期4周的移动平均。

这样做,而不是存储平均值,我会存储总和和天数(一年的第一周或最后一周可能没有7天 - 考虑边缘情况)。这样,当平均值的分母不同时,您将避免计算未加权平均值。

所以假设您有一个表“weekly_results”,其中包含字段:yearweek,sumcount,numdays。您现在可以自行加入到过去4周并获得总和和计数,然后计算平均值:

SELECT yearweek, sum_cnt/sum_dys as avg_moving_4wk
FROM (
    SELECT a.yearweek, sum(b.sumcount) as sum_cnt, sum(b.numdays) as sum_dys
    FROM weekly_results a
        join weekly_results b
        on a.yearweek - b.yearweek <4 and a.yearweek - b.yearweek >=0
    GROUP BY a.yearweek
) t1
GROUP BY yearweek