我有这样的数据,我想总结领域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
Run Code Online (Sandbox Code Playgroud)
所以我想创建这个表:
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
Run Code Online (Sandbox Code Playgroud)
我已尝试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;
Run Code Online (Sandbox Code Playgroud)
我知道 Teradata 支持窗口功能,我只是不知道它是否也支持窗口定义中的 order by。
重置总和有点复杂。您首先需要创建每次使用标志变为 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;
Run Code Online (Sandbox Code Playgroud)