Daje bieżącą sumę (ta funkcja nie została zaimplementowana w SQL Server do wersja 2012 .)
ORDER BY
definiuje okno do agregacji z UNBOUNDED PRECEDING
i CURRENT ROW
jako domyślne, gdy nie określono. SQL Server domyślnie jest mniej wydajny
RANGE
zamiast ROWS
.
W przypadku remisów mają one różną semantykę, w tym okno dla RANGE
wersja zawiera nie tylko bieżący wiersz (i poprzednie wiersze), ale także wszelkie dodatkowe powiązane wiersze o tej samej wartości a
jako bieżący wiersz. Widać to po liczbie wierszy zliczonych przez każdy z nich w poniższych wynikach.
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;
Zwroty
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
Aby osiągnąć oczekiwany wynik, pomiń oba PARTITION BY
i ORDER BY
i użyj pustej OVER()
klauzula (również pokazana powyżej).