Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

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

Fornisce un totale parziale (questa funzionalità non è stata implementata in SQL Server fino alla versione 2012 .)

Il ORDER BY definisce la finestra da aggregare con UNBOUNDED PRECEDING e CURRENT ROW come predefinito quando non specificato. Per impostazione predefinita, SQL Server è con prestazioni meno buone RANGE opzione anziché ROWS .

Hanno una semantica diversa nel caso di legami in quanto la finestra per il RANGE la versione include non solo la riga corrente (e le righe precedenti) ma anche eventuali righe collegate aggiuntive con lo stesso valore di a come riga corrente. Questo può essere visto nel numero di righe contate da ciascuna nei risultati seguenti.

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;

Resi

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

Per ottenere il risultato che ti aspettavi di ottenere, ometti entrambi il PARTITION BY e ORDER BY e usa un OVER() vuoto clausola (mostrata anche sopra).