Как найти количество непрерывно повторяющихся значений в заданном столбце?

Необходимо с помощью SQL запроса вычислить столбец Дни просрочки, в котором отразить количество идущих подряд значений столбца Задолженность равных 50, сохранив исходную сортировку:

     Номер Дата                Задолженность Дни просрочки
---------- ------------------- ------------- -------------
         1 2016-01-01 00:00:00             0             0
         1 2016-01-02 00:00:00             0             0
         1 2016-01-03 00:00:00            50             1
         1 2016-01-04 00:00:00            50             2
         1 2016-01-05 00:00:00            50             3
         1 2016-01-06 00:00:00             0             0
         1 2016-01-07 00:00:00            50             1
         1 2016-01-08 00:00:00             0             0
         1 2016-01-09 00:00:00             0             0
         1 2016-01-10 00:00:00            50             1
         1 2016-01-11 00:00:00             0             0
         1 2016-01-12 00:00:00             0             0
         2 2016-01-01 00:00:00            50             1
         2 2016-01-02 00:00:00            50             2
         2 2016-01-03 00:00:00            50             3
         2 2016-01-04 00:00:00            50             4
         2 2016-01-05 00:00:00             0             0
         2 2016-01-06 00:00:00            50             1
         2 2016-01-07 00:00:00             0             0
         2 2016-01-08 00:00:00            50             1
         2 2016-01-09 00:00:00            50             2
         2 2016-01-10 00:00:00            50             3
         2 2016-01-11 00:00:00            50             4
         2 2016-01-12 00:00:00            50             5
         2 2016-01-13 00:00:00            50             6
         2 2016-01-14 00:00:00            50             7

Как можно это реализовать в запросе?


Ответы (1 шт):

Автор решения: 0xdb

Попробуйте вот так:

select num, dt, val, countup days
from t 
match_recognize (
    partition by num order by dt 
    measures count (b.val) as countup
    all rows per match
    pattern (a* b*)
    define a as val = 0, b as val > 0);

Результат (см. на db<>fiddle):

       NUM DT                               VAL       DAYS
---------- ------------------- ---------------- ----------
         1 2016-01-01 00:00:00                0          0
         1 2016-01-02 00:00:00                0          0
         1 2016-01-03 00:00:00               50          1
         1 2016-01-04 00:00:00               50          2
         1 2016-01-05 00:00:00               50          3
         1 2016-01-06 00:00:00                0          0
         1 2016-01-07 00:00:00               50          1
         1 2016-01-08 00:00:00                0          0
         1 2016-01-09 00:00:00                0          0
         1 2016-01-10 00:00:00               50          1
         1 2016-01-11 00:00:00                0          0
         1 2016-01-12 00:00:00                0          0
         2 2016-01-01 00:00:00               50          1
         2 2016-01-02 00:00:00               50          2
         2 2016-01-03 00:00:00               50          3
         2 2016-01-04 00:00:00               50          4
         2 2016-01-05 00:00:00                0          0
         2 2016-01-06 00:00:00               50          1
         2 2016-01-07 00:00:00                0          0
         2 2016-01-08 00:00:00               50          1
         2 2016-01-09 00:00:00               50          2
         2 2016-01-10 00:00:00               50          3
         2 2016-01-11 00:00:00               50          4
         2 2016-01-12 00:00:00               50          5
         2 2016-01-13 00:00:00               50          6
         2 2016-01-14 00:00:00               50          7
→ Ссылка