Вычисления оконной функции Postgres на основе наборов из двух - PullRequest
0 голосов
/ 03 мая 2018

У меня трудности с тем, что должно быть простым запросом с использованием оконной функции. Моя проблема связана с тем, что мне нужна 2-я строка как часть уравнения.

Вот мой основной выбор * Из таблицы событий.

  id   |          type          | event_id | event_user |     event_time                                                                                                                                                                                   
-------+------------------------+----------+------------+---------------------                                                                                                                                                                             
 42047 | flex1                  |     4742 |          8 | 2018-04-29 06:25:03                                                                                                                                                                              
 42046 | flex1                  |     4742 |          8 | 2018-04-29 06:25:17                                                                                                                                                                              
 42042 | flex1                  |     4742 |          8 | 2018-04-29 06:57:00                                                                                                                                                                              
 42043 | flex1                  |     4742 |          8 | 2018-04-29 08:20:00                                                                                                                                                                              
 42045 | flex1                  |     4742 |          8 | 2018-04-29 08:34:54                                                                                                                                                                              
 42044 | flex2                  |     4742 |          8 | 2018-04-29 08:38:02    

Моя цель - получить разницу во времени между двумя событиями, где следующее событие является первым после предыдущего события. Вот так ....

  id   |          type          | event_id | event_user |     event_time                                                                                                                                                                                   
-------+------------------------+----------+------------+---------------------                                                                                                                                                                             
 42047 | flex1                  |     4742 |          8 | 2018-04-29 06:25:03                                                                                                                                                                              
 42046 | flex1                  |     4742 |          8 | 2018-04-29 06:25:17                                                                                                                                                                              

-- Need difference between event_time of (id 42046) and event_time of (id 42047)                                                                                                                                                                           

 42042 | flex1                  |     4742 |          8 | 2018-04-29 06:57:00                                                                                                                                                                              
 42043 | flex1                  |     4742 |          8 | 2018-04-29 08:20:00                                                                                                                                                                              


-- Need difference between event_time of (id 42043) and event_time of (id 42042)                                                                                                                                                                           

 42045 | flex1                  |     4742 |          8 | 2018-04-29 08:34:54                                                                                                                                                                              
 42044 | flex2                  |     4742 |          8 | 2018-04-29 08:38:02                                                                                                                                                                              


-- Need difference between event_time of (id 42044) and event_time of (id 42045) 

Любая помощь будет оценена

1 Ответ

0 голосов
/ 03 мая 2018

Если вы хотите, чтобы events был упорядочен по event_time для расчета, вы можете сначала вычислить разницу до следующей строки, а затем взять каждую вторую строку результата:

SELECT id, prev_id, diff
FROM (SELECT id,
             lag(id) OVER w AS prev_id,
             lag(event_time) OVER w - event_time AS diff,
             row_number() OVER w
      FROM events
      WINDOW w AS (ORDER BY event_time DESC)
     ) q
WHERE row_number % 2 = 0;

  id   | prev_id |   diff   
-------+---------+----------
 42045 |   42044 | 00:03:08
 42042 |   42043 | 01:23:00
 42047 |   42046 | 00:00:14
(3 rows)
...