在 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 月平均值,每月有多个条目的主要内容,如果未能解决你的问题,请参考以下文章
如何根据R中另一列的日期(月/日/年)计算列的年/月平均值、最大值、最小值等