Как конвертировать даты в диапазон дат по условию (postgres) - PullRequest
0 голосов
/ 24 июня 2019

Пожалуйста, помогите с запросом, есть такие данные: вам нужно разбить эти данные на интервалы, в столбце статуса, чтобы примерно это выглядело так:

data_image_example

client| date_start        | date_end          | status
-------------------------------------------------------
1     | 01.06.2019 0:00:00| 01.06.2019 0:02:00| 2
1     | 01.06.2019 0:02:00| 01.06.2019 0:04:00| 1
1     | 01.06.2019 0:04:00| 01.06.2019 0:05:00| 2

1 Ответ

1 голос
/ 24 июня 2019

Это форма зазоров и островков с изюминкой.Вы можете идентифицировать соседние строки, используя разницу номеров строк.Затем агрегируйте и используйте lead(), чтобы получить время окончания:

select client, status, min(time) as starttime,
       lead(min(time)) over (partition by client order by min(time)) as endtime
from  (select t.*,
              row_number() over (partition by client order by time) as seqnum,
              row_number() over (partition by client, status order by time) as seqnum_s
       from t
      ) t
group by (seqnum - seqnum_s), status, client;
...