加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:22:30 所属栏目:MsSql教程 来源:网络整理
导读:我有这个数据,我希望将字段USAGE_FLAG相加,但是当它下降到0时移动或移动到新的ID,保持按SU_ID和WEEK排序的数据集: SU_ID WEEK USAGE_FLAG100 1 0100 2 7100 3 7100 4 0101 1 0101 2 7101 3 0101 4 7102 1 7102 2 7102 3 7102 4 0 所以我想创建这个表: SU_ID
我有这个数据,我希望将字段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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读