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