Het geeft een lopend totaal (deze functionaliteit is niet geïmplementeerd in SQL Server tot versie 2012 .)
De ORDER BY
definieert het venster dat moet worden samengevoegd met UNBOUNDED PRECEDING
en CURRENT ROW
als standaard indien niet gespecificeerd. SQL Server is standaard ingesteld op de minder goed presterende
RANGE
optie in plaats van ROWS
.
Ze hebben verschillende semantiek in het geval van stropdassen doordat het venster voor de RANGE
versie bevat niet alleen de huidige rij (en voorgaande rijen) maar ook eventuele extra gebonden rijen met dezelfde waarde van a
als de huidige rij. Dit is te zien aan het aantal rijen dat door elk is geteld in de onderstaande resultaten.
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;
Retourneren
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
Om het resultaat te bereiken dat u verwachtte, laat u beide . weg de PARTITION BY
en ORDER BY
en gebruik een lege OVER()
clausule (ook hierboven weergegeven).