在可变行数上移动 AVG

问题描述 投票:0回答:2

在 Snowflake 中,我想计算数据的移动平均值,但平均值中的行数可能会发生变化。具体来说,我想将日期早于当前行中的日期 30 天或更短时间的所有记录计入平均值。但每个日期可能有多个记录,或者缺少日期。

例如:

日期 价值
1 月 1 日 100
1月5日 200
1月20日 100
2 月 3 日 0
2 月 3 日 500
2 月 10 日 400
3月8日 600

我想要的输出是:

日期 30 天平均 注意
1 月 1 日 100 (计算为
AVG(100)
1月5日 150 (计算为
AVG(100, 200)
1月20日 133 (计算为
AVG(100, 200, 100)
2 月 3 日 200 (计算为
AVG(200, 100, 0, 500)
2 月 10 日 250 (计算为
AVG(100, 0, 500, 400)
3月8日 500 (计算为
AVG(400, 600)

使用窗口框架在这里似乎不起作用,因为框架的输入数量每次都可能发生变化(取决于在此之前少于 30 天的行数)。

我该怎么做?

sql snowflake-cloud-data-platform window-functions
2个回答
2
投票

在大多数数据库上,这可以通过使用带有窗口框架的窗口函数

AVG
来完成:
RANGE BETWEEN INTERVAL

由于 Snowflake 不支持
SELECT Date, MAX(average) AS '30d_avg' FROM ( SELECT Date, AVG(Value) over(ORDER BY Date RANGE BETWEEN INTERVAL '30' DAY PRECEDING AND CURRENT ROW) as average FROM mytable ) AS s GROUP BY Date

,这是一个解决方法:

RANGE BETWEEN INTERVAL

在 mysql 上测试的演示:
https://dbfiddle.uk/miO-qNsf


0
投票

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