如何在红移中进行 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
我有以下 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