LAG и GROUP BY

У меня есть таблица, подобная этой,

 event_id |          date          
----------+------------------------
  1703702 | 2013-06-25 07:50:57-04
  3197588 | 2013-06-25 07:51:57-04
 60894420 | 2013-06-25 07:52:57-04
 60894420 | 2013-06-25 07:53:57-04
   183503 | 2013-06-25 07:54:57-04
 63116743 | 2013-06-25 07:55:57-04
 63110451 | 2013-06-25 07:56:57-04
 63116743 | 2013-06-25 07:57:57-04
 63116743 | 2013-06-25 07:58:57-04

Я хотел бы применить функцию задержки, но также и группу, чтобы найти временные интервалы между любыми событиями event_id.

Мне бы хотелось что-то вроде этого:

SELECT event_id, difference
FROM ( 
  SELECT event_id, date - lag(date) over (order by date) as
  difference FROM table GROUP BY event_id
) t;

Я не могу использовать GROUP BY с функцией LAG. Я хотел бы получить результат, похожий на следующий:

63116743, {120, 60}
60894420, {60}
...
...

Таким образом, между событиями для первого id было окно 120s и 60s и окно 60s для второго id.

Есть ли способ сделать это? Формат вывода не слишком важен, пока я могу получить его в массив в конце. Я использую Postgres 9.1

Ответы

Ответ 1

WITH diffs as (
    SELECT
        event_id,
        date - lag(date) over (partition BY event_id ORDER BY date) as difference
    FROM
        TABLE
)
SELECT
    event_id,
    array_agg( difference ) as all_diffs
FROM
    diffs
GROUP BY event_id;

Должен работать.