我有这些数据,我想对字段求和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 和周数组合在一起。
有谁知道这是否可能?我正在使用太数据
在标准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 支持窗口函数,只是不知道它是否也支持窗口定义中的排序依据。
重置总和有点复杂。您首先需要创建"组 ID",每次usage_flag变为 0 时都会更改。以下内容在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;
尝试下面的代码,使用 RESET 功能它工作正常。
select su_id,
week,
usage_flag,
SUM(usage_flag) OVER (
PARTITION BY su_id
ORDER BY week
RESET WHEN usage_flag < /* preceding row */ SUM(usage_flag) OVER (
PARTITION BY su_id ORDER BY week
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
ROWS UNBOUNDED PRECEDING
)
from emp_su;
请尝试以下 SQL:
select su_id,
week,
usage_flag,
SUM(usage_flag) OVER (PARTITION BY su_id ORDER BY week
RESET WHEN usage_flag = 0
ROWS UNBOUNDED PRECEDING
)
from emp_su;
当 usage_flag = 0 时,这里 RESET 将在总和下降时重置总和usage_flag