Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

A cláusula SQL OVER() - quando e por que é útil?


Você pode use GROUP BY SalesOrderID . A diferença é que com GROUP BY você só pode ter os valores agregados para as colunas que não estão incluídas em GROUP BY.

Por outro lado, usando funções agregadas em janela em vez de GROUP BY, você pode recuperar valores agregados e não agregados. Ou seja, embora você não esteja fazendo isso em sua consulta de exemplo, você pode recuperar OrderQty individuais valores e suas somas, contagens, médias etc. em grupos do mesmo SalesOrderID s.

Aqui está um exemplo prático de por que as agregações em janela são ótimas. Suponha que você precise calcular qual é a porcentagem de um total de cada valor. Sem agregações em janela, você teria que primeiro derivar uma lista de valores agregados e depois juntá-la de volta ao conjunto de linhas original, ou seja, assim:
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]

Agora veja como você pode fazer o mesmo com um agregado em janela:
SELECT
  [Partition],
  Value,
  Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig

Muito mais fácil e limpo, não é?