2013-06-25 14 views
15

Ho una tabella come questa,funzione GAL e 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 

mi piacerebbe applicare la funzione di ritardo, ma anche un gruppo da così posso trovare gli intervalli di tempo tra una particolare event_id.

mi piacerebbe qualcosa di simile:

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

Non posso però usare GROUP BY con la funzione GAL. Vorrei un risultato simile al seguente:

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

Quindi c'era una finestra 120s e '60 tra gli eventi del primo id, e una finestra 60 per il secondo id.

C'è un modo per farlo? Il formato di output non è troppo importante finché riesco a inserirlo in un array alla fine. Sto usando Postgres 9.1

+0

Siamo spiacenti, ma non capisco cosa significhi l'output. 120? 60? di cosa? non sembra provenire dai dati che hai mostrato. –

+0

La sotto-selezione nella tua domanda non sta aggiungendo nulla alla query - stai facendo effettivamente un "SELECT *" da esso, che è lo stesso della semplice esecuzione della query interna. – IMSoP

+0

@depesz \t È un intervallo espresso in secondi: 120s tra '2013-06-25 07: 55: 57-04' e '2013-06-25 07: 57: 57-04', quindi tra 60 e '2013 -06-25 07: 58: 57-04 ', confrontando solo gli eventi con lo stesso ID. – IMSoP

risposta

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; 

Dovrebbe funzionare.

+0

Ed ecco un SQLFiddle per dimostrarlo: http://www.sqlfiddle.com/#!1/c22fc/4 ('array_agg' sembra interrompere SQLFiddle per qualche motivo, quindi ho usato' string_agg' per verificare il risultato) – IMSoP

+1

Oh, e per esprimere in secondi, 'EXTRACT ('epoch' FROM ...)': http://www.sqlfiddle.com/#!1/c22fc/6 – IMSoP

+0

Ho frainteso la domanda e non ho incluso il cruciale 'PARTITION BY'; Stavo preparando SQLFiddle per capirlo, ma tu mi hai battuto :) – IMSoP