23

こんなテーブルがありますが、

 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;

ただし、LAG関数でGROUP BYを使用することはできません。次のような結果が必要です。

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

そのため、最初の ID のイベント間に 120 秒と 60 秒のウィンドウがあり、2 番目の ID のイベント間に 60 秒のウィンドウがありました。

これを行う方法はありますか?最終的に配列に入れることができる限り、出力形式はあまり重要ではありません。Postgres 9.1 を使用しています

4

1 に答える 1

33
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;

動作するはずです。

于 2013-06-25T16:09:19.347 に答える