我有一张这样的桌子。
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周内获得平均值?然后我该如何做到滚动平均?我最好只是在代码中执行此操作吗?
答案 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