Разбить на группы строки 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().