Разбить на группы строки postgresql

Имеется таблица

dt sum
01.01.2024 100
02.01.2024 200
03.01.2024 null
04.01.2024 150
05.01.2024 400
06.01.2024 500
08.01.2024 null
09.01.2024 null
10.01.2024 300

Необходимо разбить даты на группы, в группу входят даты, которые идут подряд до момента, когда в sum значение null, т.е. по итогу должно получится так:

dt sum grp
01.01.2024 100 1
02.01.2024 200 1
03.01.2024 null null
04.01.2024 150 2
05.01.2024 400 2
06.01.2024 500 2
08.01.2024 null null
09.01.2024 null null
10.01.2024 300 3

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


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

Автор решения: Akina
SELECT *,
       SUM(("sum" IS NULL) :: INT) OVER (ORDER BY dt) grp
FROM tablename;

Поле dt должно быть безусловно UNIQUE NOT NULL.

Запрос присвоит уникальные номера каждой группе. Но не непрерывные. Если нужно именно от единицы и без "дыр" - засунуть запрос в CTE и снаружи обработать DENSE_RANK().

→ Ссылка