我有一个如下所示的数据集,想知道如何对当前记录及其后的两个记录进行滚动平均。示例:让我们考虑第一个记录,其总数为3,然后是4和7,现在,第一个记录的3天滚动平均值为4.6,依此类推。
Date Total
1 3
2 4
3 7
4 1
5 2
6 4
预期输出:
Date Total 3day_rolling_Avg
1 3 4.6
2 4 4
3 7 3.3
4 1 2.3
5 2 null
6 4 null
PS:具有“ null”值并不重要。这只是一个样本数据,我需要查看3天以上(例如:滚动30天)
答案 0 :(得分:1)
我认为最简单的方法是使用弹出式窗口框架的窗口avg()
:
select
t.*,
avg(total)
over(order by date rows between current row and 2 following) as "3d_rolling_avg"
from mytable t
如果您希望在少于2个前导行的情况下返回null
值(如预期结果所示),则可以在其顶部使用row_number()
:
select
t.*,
case when rank() over(order by date desc) <= 2
then avg(total)
over(order by date rows between current row and 2 following)
end as "3d_rolling_avg"
from mytable t