2016-04-04 5 views
0

Ich habe einen großen Zeitreihendatensatz in einer Tabelle, die 5 Jahre Daten enthält. Die Daten sind sehr strukturiert; Es ist geclustert/geordnet in der Zeitspalte und es gibt genau einen Datensatz für genau alle 10 Minuten über den gesamten Zeitraum von 5 Jahren.Tricky: SQL Server-seitige Aggregation von Zeitreihendaten zum Chartern

In meiner User-Side-Anwendung habe ich ein Zeitreihendiagramm, das 400 Pixel breit ist, und Benutzer können die Zeitskala von 1 Stunde bis zu 5 Jahren einstellen. Daher stellt jede Abfrage der Datenbank, die mehr als 400 Datensätze zurückgibt, Daten bereit, die nicht physisch angezeigt werden können.

Was ich wissen will ist; kann jemand einen Ansatz vorschlagen, bei dem die SQL-Datenbank, wenn die Datenbank für einen bestimmten Zeitraum abgefragt wird, dynamisch eine geeignete Aggregationsaggregation erstellt, die nicht mehr als 400 Datensätze zurückgibt?

Beispiel 1): Wenn der Zeitbereich 5 Jahre betrug, würde SQL Server für alle 4,5 Tage (5 Jahre * 365 Tage/400 Datensätze) ~ 1 Wert berechnen, also alle 10-Minuten-Stichproben für jeden 4.5-Tage-Bin und einen Datensatz für jeden Behälter zurückgeben. Ungefähr 400 insgesamt.

Beispiel 2): ​​Wenn der Zeitbereich ein Monat war, würde SQL Server ~ 1 Datensatz für jede 1,85 Stunden (31 Tage/400 Datensätze) berechnen, würde also alle 10-Minuten-Stichproben für jede 1,85 Stunden-Bin und geben a Aufzeichnung für jeden Behälter. Ungefähr 400 insgesamt.

Idealerweise hätte ich gerne eine Lösung, die aus der Sicht der Anwendungen wie eine statische Tabelle abgefragt werden kann.

Ich würde wirklich jede vorgeschlagene Ansätze oder Code-Schnipsel zu schätzen wissen.

+0

Erläuterung: Die Zeitspalte ist vom Typ datetime2, mit den Wertspalten vom Typ float. –

+0

Eine große Herausforderung, die ich nicht verstehe, wie man angreift, ist, dass die Behältergröße dem Kunden nicht im Voraus bekannt ist. Die (Pseudocode) -Abfrage würde vom Client in der Form kommen: Wählen Sie die Werte aus der Tabelle, wo TimeKey zwischen StartTime und EndTime ist. Ich suche SQL-Server, um dann die folgende Logik zu berechnen: Okay, ich weiß, dass diese Client-Schnittstelle nur 400 Datensätze verarbeiten kann, also welche Aggregation sollte ich angesichts der Anzahl der Datensätze, die ich für dieses Zeitintervall habe, tun? –

Antwort

0

einige Beispiele, wenn Sie eine Datetime-Spalte (die nicht ganz klar, aus Ihrer Frage ist, da es nicht Tabellenschema):

Grouping into interval of 5 minutes within a time range

SELECT/GROUP BY - segments of time (10 seconds, 30 seconds, etc)

Sie sollten ganz einfach sein Um auf den SQL-Server zu portieren, verwenden Sie datediff, um Ihre Datetime-Werte in einen Unix-Timestamp zu konvertieren, und verwenden Sie round() mit dem Funktionsparameter <> 0 für div.

+0

Interessant. Ich wusste nicht, dass Sie nach Datum/Uhrzeit-Spalten gruppieren können. Wird das untersuchen. Vielen Dank. –