puoi usa GROUP BY SalesOrderID
. La differenza è che con GROUP BY puoi avere solo i valori aggregati per le colonne che non sono incluse in GROUP BY.
Al contrario, utilizzando le funzioni di aggregazione con finestra anziché GROUP BY, è possibile recuperare valori sia aggregati che non aggregati. Cioè, anche se non lo stai facendo nella tua query di esempio, potresti recuperare entrambi i singoli OrderQty
valori e relative somme, conteggi, medie ecc. su gruppi dello stesso SalesOrderID
s.
Ecco un esempio pratico del perché gli aggregati finestrati sono fantastici. Supponiamo di dover calcolare quale percentuale di un totale è ogni valore. Senza aggregati finestrati dovresti prima derivare un elenco di valori aggregati e quindi unirlo di nuovo al set di righe originale, ad esempio in questo modo:
SELECT
orig.[Partition],
orig.Value,
orig.Value * 100.0 / agg.TotalValue AS ValuePercent
FROM OriginalRowset orig
INNER JOIN (
SELECT
[Partition],
SUM(Value) AS TotalValue
FROM OriginalRowset
GROUP BY [Partition]
) agg ON orig.[Partition] = agg.[Partition]
Ora guarda come puoi fare lo stesso con un aggregato finestrato:
SELECT
[Partition],
Value,
Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig
Molto più semplice e pulito, vero?