我有这个数据,我想对字段USAGE_FLAG
求和,但是当它降至0或移动到新ID时重置,以保持SU_ID
和WEEK
排序的数据集:
SU_ID WEEK USAGE_FLAG
100 1 0
100 2 7
100 3 7
100 4 0
101 1 0
101 2 7
101 3 0
101 4 7
102 1 7
102 2 7
102 3 7
102 4 0
所以我想创建这个表:
SU_ID WEEK USAGE_FLAG SUM
100 1 0 0
100 2 7 7
100 3 7 14
100 4 0 0
101 1 0 0
101 2 7 7
101 3 0 0
101 4 7 7
102 1 7 7
102 2 7 14
102 3 7 21
102 4 0 0
我已经尝试过使用
MSUM()
的GROUP BY
函数,但它不会保持上面想要的顺序。它把我不需要的7和星期几组合在一起。有人知道这是否可能吗?我正在使用Teradata
最佳答案
在标准SQL中,可以使用窗口函数来完成运行总和:
select su_id,
week,
usage_flag,
sum(usage_flag) over (partition by su_id order by week) as running_sum
from the_table;
我知道Teradata支持窗口功能,但我不知道它是否还支持窗口定义中的订单。
重置总和要复杂一些。首先,您需要创建“usage_flag”每次更改为0时都会更改的“组ID”。以下内容在PostgreSQL中有效,我不知道它在Teradata中是否也适用:
select su_id,
week,
usage_flag,
sum(usage_flag) over (partition by su_id, group_nr order by week) as running_sum
from (
select t1.*,
sum(group_flag) over (partition by su_id order by week) as group_nr
from (
select *,
case
when usage_flag = 0 then 1
else 0
end as group_flag
from the_table
) t1
) t2
order by su_id, week;
关于sql - 如何根据Teradata SQL中的条件计算带重置的移动总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13819710/