亚马逊Redshift的加权移动平均线

yts*_*aig 5 amazon-redshift

有没有办法在Amazon Redshift中计算具有固定窗口大小的加权移动平均线?更详细地,给定具有日期列和值列的表,对于每个日期,计算指定大小的窗口上的加权平均值,其中权重在辅助表中指定.

到目前为止,我的搜索尝试产生了大量的例子,用于简单平均(没有权重)的窗口函数,例如这里.对于postgres也有一些相关的建议,例如,这个SO问题,但是与postgres相比,Redshift的功能集非常稀疏,并且它不支持许多建议的高级功能.

moe*_*tel 1

假设我们有下表:

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-052016-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)