Es gibt eine laufende Summe (diese Funktionalität wurde in SQL Server erst in Version 2012 implementiert .)
Der ORDER BY
definiert das zu aggregierende Fenster mit UNBOUNDED PRECEDING
und CURRENT ROW
als Standard, wenn nicht angegeben. SQL Server verwendet standardmäßig die weniger leistungsfähigen
RANGE
Option anstelle von ROWS
.
Sie haben bei Gleichständen eine andere Semantik als das Fenster für den RANGE
version enthält nicht nur die aktuelle Zeile (und vorangehende Zeilen), sondern auch alle zusätzlichen verknüpften Zeilen mit demselben Wert von a
als aktuelle Zeile. Dies ist an der Anzahl der Zeilen ersichtlich, die in den folgenden Ergebnissen jeweils gezählt werden.
SELECT a,
b,
COUNT(*) OVER (ORDER BY a
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [Rows],
COUNT(*) OVER (ORDER BY a
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [Range],
COUNT(*) OVER() AS [Over()]
FROM t;
Rückgabe
a b Rows Range Over()
-------- -------- ----------- ----------- -----------
NULL NULL 1 4 12
NULL NULL 2 4 12
NULL NULL 3 4 12
NULL NULL 4 4 12
a b 5 7 12
a b 6 7 12
a b 7 7 12
c d 8 11 12
c d 9 11 12
c d 10 11 12
c d 11 11 12
e NULL 12 12 12
Um das erwartete Ergebnis zu erzielen, lassen Sie beide weg die PARTITION BY
und ORDER BY
und verwenden Sie ein leeres OVER()
Klausel (auch oben gezeigt).