Oracle SQL - текущая сумма в зависимости от группы и условия - PullRequest
1 голос
/ 31 марта 2020

У меня есть таблица, которая выглядит как

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. Он вычисляет совокупную сумму количества столбцов до тех пор, пока метка не станет равной 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

Проблема здесь в том, что совокупная сумма останавливается в предыдущей строке (Seq) для Label = 1. Мне нужно получить промежуточную сумму до Label = 1 для каждого ID на основе Seq.

The Wrong Вывод получаю

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 голосов
/ 31 марта 2020

Вы можете создать первое окно 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

Демонстрация на 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
...