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