Det giver en løbende total (denne funktionalitet blev ikke implementeret i SQL Server før version 2012 .)
ORDER BY
definerer vinduet, der skal aggregeres med UNBOUNDED PRECEDING
og CURRENT ROW
som standard, når det ikke er angivet. SQL Server er som standard den mindre velfungerende
RANGE
mulighed i stedet for ROWS
.
De har forskellig semantik i tilfælde af bindinger, idet vinduet for RANGE
version inkluderer ikke kun den aktuelle række (og foregående rækker), men også eventuelle yderligere bundne rækker med samme værdi af a
som den aktuelle række. Dette kan ses i antallet af rækker, der er talt af hver i resultaterne nedenfor.
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;
Returnerer
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
For at opnå det resultat, som du forventede at få, udelad begge PARTITION BY
og ORDER BY
og brug en tom OVER()
klausul (også vist ovenfor).