Как найти количество непрерывно повторяющихся значений в заданном столбце?
Необходимо с помощью 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