Как рассчитать интервал между записями одной таблицы в PostgreSQL? - PullRequest
0 голосов
/ 27 марта 2020

Пример моих данных (таблица отсортирована по столбцу createAt):

 id | eventType |         createdAt          
----+-----------+----------------------------
  1 | login     | 2020-03-23 04:05:33.839+00
  2 | login     | 2020-03-23 07:52:55.684+00
  3 | login     | 2020-03-23 11:16:01.243+00
  4 | login     | 2020-03-23 11:34:28.91+00
  5 | login     | 2020-03-23 12:18:21.451+00
  6 | login     | 2020-03-23 13:03:54.742+00
  7 | logout    | 2020-03-23 18:23:26.815+00
  8 | login     | 2020-03-23 20:36:21.972+00
  9 | logout    | 2020-03-23 20:59:58.917+00
 10 | login     | 2020-03-24 04:18:20.432+00
 11 | login     | 2020-03-24 05:44:47.278+00
 12 | logout    | 2020-03-24 10:45:15.463+00
 13 | logout    | 2020-03-24 15:21:55.65+00
 14 | logout    | 2020-03-24 15:48:31.247+00
 15 | login     | 2020-03-24 16:33:23.735+00
 16 | logout    | 2020-03-24 17:07:59.192+00
 17 | logout    | 2020-03-24 18:15:03.661+00
 18 | login     | 2020-03-24 18:29:22.68+00
 19 | logout    | 2020-03-25 01:25:48.345+00
 20 | logout    | 2020-03-25 03:33:26.909+00
 21 | login     | 2020-03-25 10:20:54.3+00

Как рассчитать интервал между каждой парой входа-выхода?

Например. Запись с ID 1 и запись с ID 7 являются первой парой входа-выхода. Запись с идентификатором 8 и запись с идентификатором 9 - это вторая пара входа-выхода и т. Д.

Некоторые из входов / выходов могут не иметь пары.

Моя PostgreSQL версия 11.

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Для каждого входа требуется следующий выход. Используйте совокупный максимум:

select sum(logout - login)
from (select createdAt as login,
             min(createdAt) filter (where eventType = 'logout') over (order by createdAt desc) as logout,
             lag(eventType) over (order by createdAt) as prev_eventType
      from t
     ) t
where eventType = 'login' and
      eventType is distinct from prev_eventType
1 голос
/ 28 марта 2020

самостоятельно объедините таблицу, например

   select t1.id, t2.id from mytable t1 
   left join mytable t2 
   on t1.id+1 = t2.id 
   and t1.eventType = t2.eventType
   where t2.id is null

, чтобы получить действительные строки в виде

1
7
8
9
10
12

, вычтя createdAt последовательных строк на втором шаге.

...