Auswählen SUMME der TOP 2 Werte in einer Tabelle mit mehreren GRUPPE in SQL
Spiele ich schon mit sets in SQL Server 2000 und habe folgende Tabellenstruktur für eine meiner temporären Tabellen (#Perioden):
RestCTR HoursCTR Dauer Rest ---------------------------------------- 1 337 2 0 2 337 46 1 3 337 2 0 4 337 46 1 5 338 1 0 6 338 46 1 7 338 2 0 8 338 46 1 9 338 1 0 10 339 46 1 ...
Was ich gerne machen würde, ist die Berechnung der Summe der 2 längsten Ruhezeiten für jeden HoursCTR, vorzugsweise mit sets, und temporäre Tabellen (eher als Cursor, oder verschachtelte Unterabfragen).
Hier ist das Traum-Abfrage, die einfach nicht funktioniert in SQL (egal wie oft ich es laufen):
Select HoursCTR, SUM ( TOP 2 Duration ) as LongestBreaks
FROM #Periods
WHERE Rest = 1
Group By HoursCTR
Den HoursCTR kann eine beliebige Anzahl von Ruhezeiten (einschließlich keine).
Meine aktuelle Lösung ist nicht sehr elegant und im Grunde umfasst die folgenden Schritte:
- Man die max Dauer der rest, Gruppe, durch HoursCTR
- Wählen Sie den ersten (min) RestCTR Zeile zurückgibt, die diese max Dauer für jede HoursCTR
- Wiederholen Sie Schritt 1 (ohne die Zeilen, die bereits gesammelt in Schritt 2)
- Wiederholen Sie Schritt 2, (wieder, ohne Zeilen gesammelt in Schritt 2)
- Kombinieren die RestCTR Zeilen (Schritt 2 und 4) in eine einzige Tabelle
- Bekommen SUMME der Dauer wies auf die durch die Zeilen in Schritt 5, gruppiert nach HoursCTR
Wenn es irgendwelche set-Funktionen, schneiden Sie diesen Prozess verlangsamen, dann wären Sie sehr willkommen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der beste Weg, dies zu tun in der SQL-Server ist mit einem common table expression, die Nummerierung der Zeilen in jeder Gruppe mit der windowing-Funktion
ROW_NUMBER()
:edit: ich habe eine ORDER BY-Klausel in der Partitionierung, um die zwei längsten Pausen.
Mea culpa, ich habe nicht bemerkt, dass Sie dies brauchen, um Ihre Arbeit in Microsoft SQL Server 2000. Diese version keine Unterstützung für CTE-oder Window-Funktionen. Ich überlasse die Antwort oben, falls es jemandem hilft.
In SQL Server 2000, der gemeinsame Rat ist, verwenden Sie eine korrelierte Unterabfrage:
SQL 2000 nicht haben CTE ist, noch
ROW_NUMBER()
.Korrelierte Unterabfragen können, brauchen Sie einen extra Schritt bei der Verwendung
group by
.Sollte diese Arbeit für Sie:
Leider für dich, Alex, du hast die richtige Lösung: korrelierte Unterabfragen, je nachdem, wie Sie strukturiert sind, wird am Ende feuern mehrere Male, potenziell geben Sie Hunderten von einzelnen query-Ausführungen.
Setzen Sie Ihre aktuelle Lösung in den Query Analyzer, aktivieren Sie "Show Execution Plan" (Strg+K), und führen Sie es. Sie haben eine zusätzliche Registerkarte auf der Unterseite, die Ihnen zeigen wird, wie der Motor ging über den Prozess des Sammelns Ihre Ergebnisse. Wenn Sie das gleiche tun mit der korrelierten Unterabfrage, werden Sie sehen, was diese option tut.
Ich glaube, dass es wahrscheinlich der hammer #Perioden-Tabelle, etwa so viele Male, wie Sie einzelne Zeilen in dieser Tabelle.
Auch etwas aus über die korrelierte Unterabfrage, scheint mir. Da ich vermeiden wie die Pest, zu wissen, dass Sie sind böse, ich bin mir nicht sicher, wie man über die Festsetzung es.