Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

TSQL OVER-Klausel:COUNT(*) OVER (ORDER BY a)

Es gibt eine laufende Summe (diese Funktionalität wurde in SQL Server erst in Version 2012 implementiert .)

Der ORDER BY definiert das zu aggregierende Fenster mit UNBOUNDED PRECEDING und CURRENT ROW als Standard, wenn nicht angegeben. SQL Server verwendet standardmäßig die weniger leistungsfähigen RANGE Option anstelle von ROWS .

Sie haben bei Gleichständen eine andere Semantik als das Fenster für den RANGE version enthält nicht nur die aktuelle Zeile (und vorangehende Zeilen), sondern auch alle zusätzlichen verknüpften Zeilen mit demselben Wert von a als aktuelle Zeile. Dies ist an der Anzahl der Zeilen ersichtlich, die in den folgenden Ergebnissen jeweils gezählt werden.

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;

Rückgabe

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

Um das erwartete Ergebnis zu erzielen, lassen Sie beide weg die PARTITION BY und ORDER BY und verwenden Sie ein leeres OVER() Klausel (auch oben gezeigt).