2013-06-25 101 views
15

我有一個表像這樣,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 

我想用這樣我就可以找到任何特定事項標識之間的時間間隔應用滯後功能,而且一個組。

我想是這樣的:

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} 
... 
... 

因此就出現了60年代的窗口,第二ID爲第一ID的事件之間的120秒和60秒的窗口,和。

有沒有辦法做到這一點?輸出格式不是太重要,只要我可以把它放到數組中。我正在使用Postgres 9.1

+0

對不起,但我不明白輸出的意思。 120? 60?什麼?它似乎不是來自你展示的數據。 – 2013-06-25 15:55:28

+0

在你的問題中的子選擇沒有添加任何東西到查詢 - 你有效地從它做一個'SELECT *',這就像運行內部查詢一樣。 – IMSoP

+0

@depesz \t這是一段以秒爲單位的間隔:在'2013-06-25 07:55:57-04'和'2013-06-25 07:57:57-04'之間的120秒,然後是60秒到'2013 -06-25 07:58:57-04',只比較具有相同ID的事件。 – IMSoP

回答

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

應該工作。

+0

這裏有一個SQLFiddle來證明它:http://www.sqlfiddle.com/#!1/c22fc/4('array_agg'由於某種原因似乎破壞了SQLFiddle,所以我用'string_agg'來檢查結果) – IMSoP

+1

哦,並用秒錶示,'EXTRACT('epoch'FROM ...)':http://www.sqlfiddle.com/#!1/c22fc/6 – IMSoP

+0

我誤解了這個問題,並沒有包括關鍵'PARTITION BY';我正準備SQLFiddle解決它,但你打敗了我:) – IMSoP