Как отобразить начальное / конечное состояния в Postgres? - PullRequest
0 голосов
/ 04 марта 2020

У меня есть таблица с полями даты и статуса. Я хотел бы объединить данные, чтобы показать время начала и окончания, чтобы сделать горизонтальный график периода времени. Пример изображения: https://imgur.com/a/27ZmvJ8.

Мне бы хотелось иметь «временную поправку», которая гласит: «Если время больше X минут, считайте это новым периодом времени. необработанные данные:

DateTime                |        Status      |
12:01                       Online
12:02                       Online
12:04 (Notice Skip)         Online
12:07                       Online
12:08                       Offline
12:09                       Offline 
12:10                       Offline
12:11                       Offline
12:12                       Offline
1:45 (Big Skip)             Offline
1:46                        Offline
1:47                        Offline
1:48                        Offline

Окончательные результаты должны выглядеть следующим образом: обратите внимание на разницу в небольшом пропуске в 2 минуты вместо 1 и большом пропуске> 1 часа, который либо вызывает новый период времени или нет.

Start       |       End         |   Status
12:01               12:08           Online
12:08               12:12           Offline
1:45                1:48            Offline

1 Ответ

0 голосов
/ 04 марта 2020

Этот запрос может помочь ( fiddle ). Эта статья может быть также полезна:

select status, min(dt) s, max(dt) e 
from(
   select *, sum(dtDif) over (partition by status order by dt ROWS UNBOUNDED PRECEDING)  grp
   from(
      select *, case when EXTRACT(Minute FROM dt-prevdt) < 5 /*set your own value*/ then 0 else 1 end dtDif from(
         select *, lag (dt,1, dt) over (order by dt) prevdt
         from cte
        )q      
   )q1
)q2
group by status, grp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...