Gruppieren von Datensätzen nach Zeitintervallen


12

Ich habe eine Tabelle mit dem folgenden Schema und muss eine Abfrage definieren, die Daten basierend auf Zeitintervallen (z . B. Datensätze pro Minute ) gruppieren und dann die Summe der Änderungen am SnapShotValue seit der vorherigen Gruppe bereitstellen kann. Gegenwärtig erhöht sich der SnapShotValue immer, sodass ich nur die Summe der Unterschiede benötige. Kann jemand bei einer SQL Server T-SQL-Abfrage helfen, die dies tun könnte? Ich bin offen für Änderungen am Schema, aber das ist es, was ich derzeit habe.

Schema

CaptureTime   (datetime)
SnapShotValue (int)

Beispieldaten

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

Gewünschtes Abfrageergebnis

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

Antworten:


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

SE-Daten

datediff(minute, 0, CaptureTime)gibt Ihnen die Anzahl der Minuten seit 1900-01-01T00:00:00.

dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)Fügt die Anzahl der Minuten seitdem hinzu 1900-01-01T00:00:00, 1900-01-01T00:00:00um eine Datums- / Uhrzeitangabe mit nur Minuten zu erhalten.

Das 1+ist da, weil du die nächste Minute wolltest.

Um dasselbe mit einem Intervall von 5 Minuten zu tun, müssen Sie einige Berechnungen durchführen. Teilen Sie die Minuten mit 5und multiplizieren Sie mit 5, um die Minuten auf eine Genauigkeit von 5 Minuten abgerundet zu erhalten. Dies funktioniert, weil das Ergebnis einer Ganzzahldivision in SQL Server eine Ganzzahl ist.

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

Dies bot einen guten Rahmen für die Antwort, aber ich habe immer noch ein wenig Probleme zu verstehen, wie dies funktioniert. Wenn ich versucht habe, den Versatz von einem 1-Minuten-Intervall auf ein 5-Minuten-Intervall zu ändern, erhalte ich immer noch ein 1-Minuten-Intervall, wobei das gesamte Ergebnis an einem anderen Anfangspunkt beginnt. Dies ist sehr wahrscheinlich, weil ich falsch verstehe, wie das funktioniert. Könnten Sie eine weitere Probe mit einem anderen Intervall als 1 Minute bereitstellen? Danke ...
JoeGeeky

0

Das dritte Beispiel dort verwirrt mich ein wenig. Soll das 1325 sein? Basierend auf den Anforderungen zum Erfassen der Summe der Snapshot-Werte sollte die folgende Abfrage das erhalten, wonach Sie suchen.

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

0

Das Folgende ist die Übersetzung der akzeptierten Antwort in PostgreSQL (ich habe den 1. Januar 2000 als Basisdatum gewählt. Ändern Sie es auf ein früheres Datum, wenn Ihre Daten älter als dieses sind):

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' 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.