Wählen Sie Zeilen basierend auf jedem n-ten Zeitintervall aus

8

Ich habe eine Tabelle mit einem Primärschlüssel (bigint), datetime, value, foreignKey zur Konfigurationstabelle, die aus 100.000 Zeilen besteht. Ich möchte in der Lage sein, eine Zeile für ein variables Zeitintervall zu erhalten. Beispielsweise.

%Vor%

Ich habe eine CTE-Abfrage, die mehrere Zeilen für das Intervallintervall zurückgibt

%Vor%

wie:

%Vor%

Aber wie zu sehen ist, gibt es 4 für das 1. 15-Minuten-Intervall, 2 für das nächste Intervall usw. ... Schlimmer noch, Wenn zu einem genauen Zeitstempel von 15 Minuten keine Daten erhalten wurden, gibt es keinen Wert.

Was ich will, ist der letzte Wert für ein Intervall von 15 Minuten ... wenn die einzigen Daten für dieses Intervall 1 Sekunde nach dem Start des Intervalls auftraten.

Ich dachte an Blei / Über, aber wieder ... die Reihen sind nicht auf diese Weise orgazed. Primärschlüssel ist ein BigInt und ist ein gruppierter Index. Sowohl die timstamp-Spalte als auch die ConfigID-Spalte sind indiziert. Die obige Abfrage gibt 4583 Zeilen in weniger als einer Sekunde zurück.

Danke für jede Hilfe.

    
MtnManChris 13.05.2013, 20:42
quelle

3 Antworten

1

Versuchen Sie dies für die Größe. Es wird sogar die Rückgabe einer Zeile für Instanzen behandelt, wenn Sie mehrere Zeitstempel für ein bestimmtes Intervall haben. HINWEIS: Dies setzt voraus, dass Ihre Bigint PK-Spalte den Namen idx hat. Ersetzen Sie einfach, wo Sie "idx" sehen, wenn es nicht ist.

%Vor%

Dies ist ein weiteres Beispiel für die clevere Zeitgruppenfunktion von @MntManChris:

%Vor%     
Rob.Kachmar 13.05.2013, 22:23
quelle
1

Wenn Sie in 15-Minuten-Intervallen partitionieren möchten, verwenden Sie datediff in Minuten und dividieren Sie durch 15. Verwenden Sie diese Partition, um jedes Intervall zu bewerten.

%Vor%     
arunlalam 13.05.2013 21:10
quelle
1

Wie mein Kommentar oben sagt, habe ich Robs Antwort verwendet, aber eine Benutzerfunktion hinzugefügt, um die Interval_Helper-Tabelle und den ersten Join zu eliminieren. Hier ist der Code für die Benutzerfunktion.

%Vor%

Dies hat dann die Tabelle Time_Interval wie

aussehen lassen %Vor%

Da es einen Wechsel von "Stunden" zu "Tagen" gibt, geht der @TimeInterval von 1 Stunde bis 6 Stunden oder 12 Stunden oder jeden Tag. Ich musste auch die Tabelle Time_Interval_TimeGroup von der Gruppierung nach [Stunde] zur Gruppierung nach [Tag] wechseln und natürlich diese in der Auswahlliste haben.

Da dies Teil eines viel größeren abstrakten DB-Schemas ist, in dem sowohl die fragliche Tabelle als auch die db Funktionen der ConfigID sind und somit dynamisches SQL benötigt wird, war die Implementierung dieses Schalters bei der Gruppierung kein Problem, ich habe einfach zwei verschiedene dynSql eingefügt Abschnitte basieren auf dem Wert von @TimeInterval

Danke

    
MtnManChris 14.05.2013 20:19
quelle

Tags und Links