sql >> Base de Datos >  >> RDS >> Sqlserver

La cláusula SQL OVER():¿cuándo y por qué es útil?

Tu puedes use GROUP BY SalesOrderID . La diferencia es que con GROUP BY solo puede tener los valores agregados para las columnas que no están incluidas en GROUP BY.

Por el contrario, al usar funciones agregadas en ventana en lugar de GROUP BY, puede recuperar valores agregados y no agregados. Es decir, aunque no esté haciendo eso en su consulta de ejemplo, podría recuperar tanto OrderQty individuales valores y sus sumas, conteos, promedios, etc. sobre grupos del mismo SalesOrderID s.

Aquí hay un ejemplo práctico de por qué los agregados en ventana son geniales. Suponga que necesita calcular qué porcentaje de un total es cada valor. Sin agregados en ventana, primero tendría que derivar una lista de valores agregados y luego volver a unirla al conjunto de filas original, es decir, así:

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]

Ahora mire cómo puede hacer lo mismo con un agregado en ventana:

SELECT
  [Partition],
  Value,
  Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig

Mucho más fácil y limpio, ¿no?