Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Clause TSQL OVER :COUNT(*) OVER (ORDER BY a)

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