sql >> Database >  >> RDS >> Sqlserver

De SQL OVER()-clausule - wanneer en waarom is het nuttig?

Je kunt gebruik GROUP BY SalesOrderID . Het verschil is dat u met GROUP BY alleen de geaggregeerde waarden kunt hebben voor de kolommen die niet zijn opgenomen in GROUP BY.

Als u daarentegen aggregatiefuncties in vensters gebruikt in plaats van GROUP BY, kunt u zowel geaggregeerde als niet-geaggregeerde waarden ophalen. Dat wil zeggen, hoewel u dat niet doet in uw voorbeeldquery, zou u zowel individuele OrderQty kunnen ophalen waarden en hun sommen, tellingen, gemiddelden enz. over groepen van dezelfde SalesOrderID v.

Hier is een praktisch voorbeeld van waarom vensteraggregaten geweldig zijn. Stel dat u moet berekenen welk percentage van een totaal elke waarde is. Zonder vensteraggregaten zou u eerst een lijst met geaggregeerde waarden moeten afleiden en deze vervolgens weer samenvoegen met de oorspronkelijke rijenset, d.w.z. als volgt:

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]

Kijk nu hoe u hetzelfde kunt doen met een aggregaat met vensters:

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

Veel gemakkelijker en schoner, nietwaar?



  1. Top back-uptools voor PostgreSQL

  2. Waarom mijn pessimistische Locking in JPA met Oracle niet werkt

  3. Snelste controle of rij bestaat in PostgreSQL

  4. Postgres now() tijdstempel verandert niet, wanneer het script werkt