Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Die SQL OVER()-Klausel – wann und warum ist sie nützlich?

Sie können Verwenden Sie GROUP BY SalesOrderID . Der Unterschied besteht darin, dass Sie mit GROUP BY nur die aggregierten Werte für die Spalten haben können, die nicht in GROUP BY enthalten sind.

Im Gegensatz dazu können Sie mit fensterbasierten Aggregatfunktionen anstelle von GROUP BY sowohl aggregierte als auch nicht aggregierte Werte abrufen. Das heißt, obwohl Sie dies in Ihrer Beispielabfrage nicht tun, könnten Sie beide einzelne OrderQty abrufen Werte und deren Summen, Zählungen, Durchschnittswerte etc. über Gruppen gleicher SalesOrderID s.

Hier ist ein praktisches Beispiel dafür, warum gefensterte Aggregate großartig sind. Angenommen, Sie müssen berechnen, wie viel Prozent einer Gesamtsumme jeder Wert ausmacht. Ohne gefensterte Aggregate müssten Sie zuerst eine Liste von aggregierten Werten ableiten und sie dann wieder mit dem ursprünglichen Rowset verbinden, z. B. so:

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]

Sehen Sie sich nun an, wie Sie dasselbe mit einem Fenster-Aggregat tun können:

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

Viel einfacher und sauberer, nicht wahr?