Det ger en löpande summa (denna funktionalitet implementerades inte i SQL Server förrän version 2012 .)
ORDER BY
definierar fönstret som ska aggregeras med UNBOUNDED PRECEDING
och CURRENT ROW
som standard när det inte anges. SQL Server har som standard den sämre presterande
RANGE
alternativ istället för ROWS
.
De har olika semantik när det gäller kopplingar genom att fönstret för RANGE
versionen inkluderar inte bara den aktuella raden (och föregående rader) utan även alla ytterligare kopplade rader med samma värde på a
som aktuell rad. Detta kan ses i antalet rader som räknas av var och en i resultaten nedan.
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;
Retur
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
För att uppnå det resultat som du förväntade dig att få, utelämna båda PARTITION BY
och ORDER BY
och använd en tom OVER()
klausul (visas även ovan).