在 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 | (计算为 ) |
1月5日 | 150 | (计算为 ) |
1月20日 | 133 | (计算为 ) |
2 月 3 日 | 200 | (计算为 ) |
2 月 10 日 | 250 | (计算为 ) |
3月8日 | 500 | (计算为 ) |
使用窗口框架在这里似乎不起作用,因为框架的输入数量每次都可能发生变化(取决于在此之前少于 30 天的行数)。
我该怎么做?
在大多数数据库上,这可以通过使用带有窗口框架的窗口函数
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