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

La clausola SQL OVER() - quando e perché è utile?

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?