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).