Объедините строки в таблице, используя столбец в качестве ссылки [PSQL] - PullRequest
0 голосов
/ 19 марта 2019

У меня есть таблица 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 статус всегда вставляется после ONstatus (перед 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

Могу ли я сделать это с помощью более простого запроса?Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Я думаю, вы получите результат, используя запрос ниже:

SELECT id,on_date,off_date from (SELECT id,date as on_date,'' as off_date FROM test WHERE status = 'ON' UNION ALL SELECT id,'' as on_date,date as off_date FROM test WHERE status = 'OFF') as a

0 голосов
/ 19 марта 2019

использовать ниже SQL:

select tt.id, tt.date as on_date, (select idate from 
table where id=tt.id and status='OFF' and 
date>=tt.idate and rownum<2) as off_date from table tt
where status='ON'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...