如何根据teradata SQL中的条件计算移动总和?

wil*_*nm2 7 sql sum teradata

我有这样的数据,我想总结领域USAGE_FLAG,但复位时降至为0或移动到一个新的ID保持数据集的排序SU_IDWEEK:

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

a_h*_*ame 6

在标准 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)