У меня есть таблица postgresql, подобная этой:
| id | date | status |
|------|------------|--------|
| id1 | 2019-01-01 | ON |
| id1 | 2019-01-02 | OFF |
| id1 | 2019-01-03 | ON |
Как мне объединить строки в sth так:
| id | on_date | off_date |
|------|------------|------------|
| id1 | 2019-01-01 | 2019-01-02 |
| id1 | 2019-01-03 | |
OFF
статус всегда вставляется после ON
status (перед off_date будет on_date)
Мое текущее решение:
WITH ons AS (
SELECT id, row_number() OVER(ORDER BY date) as row_num, date as on_date
FROM table
WHERE status = 'ON' AND id = id1),
offs AS (
SELECT id, row_number() OVER(ORDER BY date) as row_num, date as off_date
FROM table
WHERE status = 'OFF' AND id = id1)
SELECT ons.id, ons.on_date, offs.off_date
FROM ons
LEFT JOIN offs ON ons.id = off.id AND ons.row_num = offs.row_num
Могу ли я сделать это с помощью более простого запроса?Спасибо.