如何在红移中进行 x 天分组总和?

How to do a x-days grouped sum in redshift?

我有以下 table, 显示不同单位的物品在不同日期进入库存的数量。

ID    Date       Unit   Quantity 
---------------------------------
1    2017-08-01  A_red      05
2    2017-08-13  A_red      10
3    2017-09-20  A_red      20
4    2017-09-22  A_red      40
5    2017-10-05  A_red      40
6    2017-10-25  A_red      30
7    2017-10-24  A_blue     60

问题是:同一单元30天时间间隔内的条目应该分组。
所以我想要以下结果:

ID    Date      Unit   Quantity fst_entry30 Quantity30  
-----------------------------------------------------
1   2017-08-01  A_red     05       T          15
2   2017-08-13  A_red     10       F          15
3   2017-09-20  A_red     20       T          100
4   2017-09-22  A_red     40       F          100
5   2017-10-05  A_red     40       F          100
6   2017-10-25  A_red     30       T          30
7   2017-10-24  A_blue    60       T          60

其中 fst_entry30 是一个标志,指示条目是否是该单元在过去 30 天内的第一个条目。请注意,如果我有不同的单位(A_blue 而不是 A_red),它不会被分组。
而quantity30是quantity的分组总和。
比如10月5日到9月20日之间,不到30天,就分组了。

记住 Redshift 不允许递归通用 table 表达式。 我已经尝试过自连接,但结果很麻烦。

您只需使用 lag() 来定义组:

select t.*,
       (case when date >= lag(date) over (partition by unit order by date) + interval '30 day'
             then 0 else 1
        end) as grp_start
from t;

然后你可以做一个累加和来给组分配一个数字。 . .最后使用 window 函数将它们相加:

select t.*, sum(quantity) over (partition by unit, grp)
from (select t.*,
             sum(grp_start) over (partition by unit order by date) as grp
      from (select t.*,
                   (case when date >= lag(date) over (partition by unit order by date) + interval '30 day'
                         then 0 else 1
                    end) as grp_start
            from t
           ) t
      ) t