在 Redshift 中滚动 N 月平均值,每月有多个条目

Posted

技术标签:

【中文标题】在 Redshift 中滚动 N 月平均值,每月有多个条目【英文标题】:Rolling N monthly average in Redshift with multiple entries per month 【发布时间】:2020-12-08 23:30:12 【问题描述】:

我想使用 Redshift 的窗口聚合函数来创建一些数据的“N”个月滚动平均值。每个给定月份的数据将有多个唯一条目。如果可能的话,我想避免在执行滚动平均之前的几个月内首先进行分组和平均,因为这是取平均值而不是理想的平均值(正如这篇文章所做的那样:3 Month Moving Average - Redshift SQL)。

这是一个仅包含一个帐户的示例数据集(会有多个帐户)。

Quote Date      Account.   Value 
3/24/2015       acme.       3
3/25/2015       acme.       7     
4/1/2015        acme.       12          
4/3/2015        acme.       17         
5/15/2015       acme.       1         
6/30/2015       acme.       3
7/30/2015       acme.       9

这就是我希望 3 个月滚动平均值的结果(例如)。

Quote_Date      Account.   Value  Month 3M_Rolling_Average
3/24/2015       acme.       3        1       3
3/25/2015       acme.       7        1       5
4/1/2015        acme.       12       2       7.33
4/3/2015        acme.       17       2       9.75
5/15/2015       acme.       1        3       8
6/30/2015       acme.       3        4       8.25
7/30/2015       acme.       9        5       4.33

我试过的代码是这样的:

avg(Value) over (partition by Account order by Quote Date rows between 2 preceding and current row)

但是,这只对最后 2 行(包括当前行)有效,如果我每个月都有一个唯一值,这将起作用,但如前所述,情况并非如此。我对任何类型的排名解决方案或嵌套分区持开放态度。非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

由于平均值只是 sum() / count(),因此您只需按月分组,然后得到 sum() 和 count()。然后使用您的滞后将 3 个月的总和除以 3 个月的计数总和。你是正确的,平均数是不正确的,但是如果你进行总和和计数,事情就会起作用。

【讨论】:

这是一个如此简单、直接的答案,我不敢相信我自己没有想到。感谢您的快速回复。

以上是关于在 Redshift 中滚动 N 月平均值,每月有多个条目的主要内容,如果未能解决你的问题,请参考以下文章

pandas 重新采样以获得具有时间序列数据的月平均值

如何根据R中另一列的日期(月/日/年)计算列的年/月平均值、最大值、最小值等

如何将数据框的单个值除以月平均值?

仅当每月少于 10 天是 NA 时,如何使用 dplyr 和 lubridate 每月汇总每日数据?

多个数据点的交叉表查询

Postgresql redshift 版本:每月月底检索销售额