Как найти пары событий с postgres? - PullRequest
0 голосов
/ 01 июня 2018

У меня есть таблица событий:

             ts             |  user  | reason 
----------------------------+--------+--------
 2018-06-01 10:44:15.52+01  | 359999 | START
 2018-06-01 10:44:29.521+01 | 359999 | STOP
 2018-06-01 10:44:43.52+01  | 359998 | START
 2018-06-01 10:44:55.52+01  | 359999 | START
 2018-06-01 10:44:59.521+01 | 359998 | STOP
 2018-06-01 10:45:07.52+01  | 359999 | STOP
 2018-06-01 10:46:16.52+01  | 359999 | START

И я хочу найти пары событий:

  user  |           start            |            stop            
--------+----------------------------+----------------------------
 359999 | 2018-06-01 10:44:15.52+01  | 2018-06-01 10:44:29.521+01
 359998 | 2018-06-01 10:44:43.52+01  | 2018-06-01 10:44:59.521+01
 359999 | 2018-06-01 10:44:55.52+01  | 2018-06-01 10:45:07.52+01
 359999 | 2018-06-01 10:46:16.52+01  |

Какой запрос может это сделать?

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Вы можете сделать это довольно легко с помощью оконной функции .Среди прочего, они позволяют ссылаться на следующую / предыдущую строку в результате запроса (через lead() и lag()).Например:

SELECT "user", ts AS start, next_ts AS stop
FROM (
  SELECT *, lead(ts) OVER (PARTITION BY "user" ORDER BY ts) AS next_ts
  FROM events
  WHERE reason IN ('START', 'STOP')
) AS ts_pairs
WHERE reason = 'START'
0 голосов
/ 01 июня 2018

Только что это заработало.Есть ли более эффективный способ?

select imei, reason, ts AS start, (
    select ts
    from events as stops
    where stops.ts > starts.ts
    and reason = 'STOP'
    and stops.user = starts.user
    order by ts desc
    limit 1
) as stop
from events as starts
where reason = 'START'
order by ts
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...