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

时间:2020-03-31 16:38:41

标签: sql oracle oracle-sqldeveloper window-functions gaps-and-islands

我的桌子看起来像

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 个答案:

答案 0 :(得分:0)

您可以创建第一个窗口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

ID | SEQ | LABEL | COUNT1 | GRP | 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