Come è possibile sommare al meglio le differenze di un intervallo di date nella stessa colonna tra righe interlacciate? Ho una colonna Datetime e voglio calcolare la differenza tra le righe. Voglio la differenza in secondi. Questa domanda non riguarda come ottenere una differenza tra 2 timestamp, ma è più focalizzata su come calcolare in modo più efficiente tra le righe nella stessa tabella. Nel mio caso ogni riga ha un tipo di evento datetime che collega logicamente 2 righe insieme.
Dettagli relativi a come raggruppare i tipi di eventi di inizio e fine. (Andriy M's Question) Inizio e fine "dovrebbero" essere consecutivi. Se un inizio non ha una fine successiva, dovrebbe essere escluso dalla somma. Passa al prossimo inizio per vedere se ha una fine. Alla somma dei secondi totali devono essere aggiunte solo coppie consecutive Inizio - Fine.
Lavorare in postgresql 9.x ...
Dati di esempio in tabella;
eventtype, eventdate
START, 2015-01-01 14:00
END, 2015-01-01 14:25
START, 2015-01-01 14:30
END, 2015-01-01 14:43
START, 2015-01-01 14:45
END, 2015-01-01 14:49
START, 2015-01-01 14:52
END, 2015-01-01 14:55
Nota, tutte le date di inizio e fine saranno sequenziali.
Ecco il mio primo tentativo. Sembra funzionare.
SELECT
-- starts.*
SUM(EXTRACT(EPOCH FROM (eventdate_next - eventdate))) AS duration_seconds
FROM
(
WITH x AS (
SELECT *, dense_rank() OVER (ORDER BY eventdate) AS rnk
FROM table
AND eventdate > '2015-01-01 00:00:00.00'
AND eventdate < '2016-01-01 23:59:59.59'
)
SELECT x.eventdate, x.eventtype, y.eventdate AS eventdate_next, y.eventtype AS eventtype_next
FROM x
LEFT JOIN (SELECT DISTINCT eventdate, eventtype, rnk FROM x) y ON y.rnk = (x.rnk + 1)
ORDER BY x.eventdate
) starts
WHERE
eventtype = 'START'
GROUP BY eventtype
Il mio primo tentativo si basa su un ottimo esempio di StackOverflow Postgres 9.1 - Ottenere il valore successivo
Nota; Puoi commentare GROUP BY e SUM e annullare il commento degli inizi. * Per ottenere un record per ogni singola durata andando nella somma.