Raggruppamento di record in base a intervalli di tempo


12

Ho una tabella con il seguente schema e devo definire una query in grado di raggruppare i dati in base a intervalli di tempo ( es. Record al minuto ) e quindi fornire la somma delle modifiche a SnapShotValue dal gruppo precedente. Al momento, SnapShotValue aumenta sempre, quindi ho solo bisogno della somma delle differenze. Qualcuno può aiutare con una query T-SQL di SQL Server che potrebbe fare questo? Sono aperto a cambiare lo schema, ma questo è quello che ho attualmente.

Schema

CaptureTime   (datetime)
SnapShotValue (int)

Dati di esempio

1 Jan 2012 00:00:00,   100
1 Jan 2012 00:00:30,   125
1 Jan 2012 00:01:00,   200
1 Jan 2012 00:01:30,   300
1 Jan 2012 00:02:15,   400
1 Jan 2012 00:02:30,   425
1 Jan 2012 00:02:59,   500

Risultato della query desiderato

1 Jan 2012 00:01:00,   225 -- Sum of all captured data changes up to the 1 minute mark
1 Jan 2012 00:02:00,   500 -- Sum of all captured data changes up to the 2 minute mark
1 Jan 2012 00:03:00,   125 -- Sum of all captured data changes up to the 3 minute mark

Risposte:


17
select dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0),
       sum(SnapShotValue)
from YourTable
group by dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)

SE-Data

datediff(minute, 0, CaptureTime)ti dà il numero di minuti da allora 1900-01-01T00:00:00.

dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)aggiunge il numero di minuti da quando 1900-01-01T00:00:00per 1900-01-01T00:00:00finire con un datetime con solo pochi minuti.

L' 1+è lì perché si voleva il minuto successivo.

Per fare lo stesso con un intervallo di 5 minuti è necessario eseguire alcuni calcoli. Dividi i minuti con 5e moltiplica con 5per ottenere i minuti arrotondati per difetto con una precisione di 5 minuti. Questo funziona perché il risultato di una divisione di numeri interi in SQL Server è un numero intero.

dateadd(minute, 5 + (datediff(minute, 0, CaptureTime) / 5) * 5, 0)

Questo ha fornito un buon quadro per la risposta, ma ho ancora qualche problema a capire come funziona. Quando ho provato a cambiare l'offset da un intervallo di 1 minuto a un intervallo di 5 minuti, ottengo ancora un intervallo di 1 minuto con l'intero risultato che inizia da un punto di partenza diverso. Questo è molto probabilmente perché sto fraintendendo come funziona. Potresti fornire un altro campione che mostra un intervallo diverso da 1 minuto? Grazie ...
JoeGeeky,

0

Sono un po 'confuso dal terzo esempio lì, dovrebbe essere il 1325? In base ai requisiti di acquisizione della somma dei valori dell'istantanea, la query seguente dovrebbe ottenere ciò che stai cercando.

select dateadd(minute,1,convert(varchar(20),capturetime)), sum(snapshotvalue)
from snapshotdata sd
group by dateadd(minute,1,convert(varchar(20),capturetime))

0

Quella che segue è la traduzione della risposta accettata in PostgreSQL (ho scelto il 1 ° gennaio 2000 come data di base. Modificala con una data precedente se i tuoi dati sono più vecchi di quello):

SELECT 
  TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
  , SUM(SnapShotValue)
FROM table_name
GROUP BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
ORDER BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.