Il donne un total cumulé (cette fonctionnalité n'a pas été implémentée dans SQL Server jusqu'à version 2012 .)
Le ORDER BY définit la fenêtre à agréger avec UNBOUNDED PRECEDING et CURRENT ROW par défaut lorsqu'il n'est pas spécifié. Par défaut, SQL Server est moins performant
RANGE option plutôt que ROWS .
Ils ont une sémantique différente en cas d'égalité dans la mesure où la fenêtre de la RANGE version inclut non seulement la ligne actuelle (et les lignes précédentes), mais également toutes les lignes liées supplémentaires avec la même valeur de a comme ligne actuelle. Cela peut être vu dans le nombre de lignes comptées par chacun dans les résultats ci-dessous.
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;
Retours
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
Pour obtenir le résultat que vous attendiez, omettez les deux le PARTITION BY et ORDER BY et utilisez un OVER() vide clause (également indiquée ci-dessus).