我有这个数据,我希望将字段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
我已经尝试使用GROUP BY的MSUM()函数,但它不会保持我想要的顺序.它将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支持窗口函数,我只是不知道它是否也支持窗口定义中的顺序.
重置总和有点复杂.您首先需要创建“group ID”,每次usage_flag变为0时都会更改.以下是Postgresql中的工作,我不知道这是否也适用于Teradata:
- select su_id,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;