有没有办法在Amazon Redshift中计算具有固定窗口大小的加权移动平均线?更详细地,给定具有日期列和值列的表,对于每个日期,计算指定大小的窗口上的加权平均值,其中权重在辅助表中指定.
到目前为止,我的搜索尝试产生了大量的例子,用于简单平均(没有权重)的窗口函数,例如这里.对于postgres也有一些相关的建议,例如,这个SO问题,但是与postgres相比,Redshift的功能集非常稀疏,并且它不支持许多建议的高级功能.
假设我们有下表:
create temporary table _data (ref_date date, value int);
insert into _data values
('2016-01-01', 34)
, ('2016-01-02', 12)
, ('2016-01-03', 25)
, ('2016-01-04', 17)
, ('2016-01-05', 22)
;
create temporary table _weight (days_in_past int, weight int);
insert into _weight values
(0, 4)
, (1, 2)
, (2, 1)
;
Run Code Online (Sandbox Code Playgroud)
然后,如果我们想要计算三天窗口(包括当前日期)的移动平均值,其中接近当前日期的值被赋予比过去更远的值更高的权重,我们期望加权平均值为2016-01-05(基于2016-01-05、2016-01-04和的值2016-01-03):
(22*4 + 17*2 + 25*1) / (4+2+1) = 147 / 7 = 21
Run Code Online (Sandbox Code Playgroud)
查询可能如下所示:
(22*4 + 17*2 + 25*1) / (4+2+1) = 147 / 7 = 21
Run Code Online (Sandbox Code Playgroud)
给出结果:
ref_date | weighted_average
------------+------------------
2016-01-03 | 23
2016-01-04 | 19
2016-01-05 | 21
(3 rows)
Run Code Online (Sandbox Code Playgroud)