Oracle SQL - 基于分组和条件运行求和

Posted

技术标签:

【中文标题】Oracle SQL - 基于分组和条件运行求和【英文标题】:Oracle SQL - Running Sum based on group by and condition 【发布时间】:2020-03-31 16:38:41 【问题描述】:

我的桌子看起来像

ID      SEQ       LABEL     COUNT
1        1           0       3
1        2           0       2
1        3           0       6
1        4           1       2
1        5           0       3
1        6           0       5
2        1           0       2
2        2           1       1
2        3           0       3

我想创建一个名为 running_count 的列。它计算列计数的累积总和,直到Label为1,然后重置并再次开始累积总和。

预期输出:

ID      SEQ       LABEL1     COUNT1     RUNNING_COUNT
1        1           0       3              3
1        2           0       2              5
1        3           0       6              14
1        4           1       2              16
1        5           0       3              3
1        6           0       5              8
2        1           0       2              2
2        2           1       1              3
2        3           0       3              3

我尝试了以下查询

SELECT A.*, SUM(COUNT1) over (partition by ID,LABEL1 order by SEQ) as RUNNING_COUNT FROM TABLE_1 A

这里的问题是,对于 Label = 1,累积总和在前一行(Seq)中停止。我需要根据 Seq 为每个 ID 获取运行总和直到 Label = 1。

我得到的错误输出

ID      SEQ       LABEL1     COUNT1     RUNNING_COUNT
1        1           0       3              3
1        2           0       2              5
1        3           0       6              14
1        4           1       2              2
1        5           0       3              3
1        6           0       5              8
2        1           0       2              2
2        2           1       1              1
2        3           0       3              3

【问题讨论】:

【参考方案1】:

您可以创建第一个窗口sum() 来定义组,然后将其用作外部查询的分区:

select 
    t.*,
    sum(count1) over(partition by id, grp order by seq) running_count
from (
    select 
        t.*,
        sum(label) over(partition by id order by seq desc) grp
    from mytable t
) t

Demo on DB Fiddle

身份证 |序列 |标签 |计数1 |玻璃钢 | RUNNING_COUNT 个 -: | --: | ----: | -----: | --: | ------------: 1 | 1 | 0 | 3 | 1 | 3 1 | 2 | 0 | 2 | 1 | 5 1 | 3 | 0 | 6 | 1 | 11 1 | 4 | 1 | 2 | 1 | 13 1 | 5 | 0 | 3 | 0 | 3 1 | 6 | 0 | 5 | 0 | 8 2 | 1 | 0 | 2 | 1 | 2 2 | 2 | 1 | 1 | 1 | 3 2 | 3 | 0 | 3 | 0 | 3

【讨论】:

以上是关于Oracle SQL - 基于分组和条件运行求和的主要内容,如果未能解决你的问题,请参考以下文章

sql 分组 求累计值

SQL 条件求和和分组

oracle求和问题,不要分组条件,只要求和

SQL:按日期分组并对列中的值求和

Oracle_SQL 分组与聚合函数

在Oracle SQL中,只对特定条件下的字段进行求和。