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

SQL OVER()-sætningen - hvornår og hvorfor er den nyttig?

Du kan brug GROUP BY SalesOrderID . Forskellen er, med GROUP BY kan du kun have de aggregerede værdier for de kolonner, der ikke er inkluderet i GROUP BY.

I modsætning hertil kan du ved at bruge aggregerede vinduesfunktioner i stedet for GROUP BY hente både aggregerede og ikke-aggregerede værdier. Det vil sige, selvom du ikke gør det i din eksempelforespørgsel, kan du hente både individuelle OrderQty værdier og deres summer, antal, gennemsnit osv. over grupper af samme SalesOrderID s.

Her er et praktisk eksempel på, hvorfor vinduesaggregater er fantastiske. Antag, at du skal beregne, hvor stor en procentdel af hver værdi er. Uden aggregater med vinduer skal du først udlede en liste over aggregerede værdier og derefter forbinde den tilbage til det oprindelige rækkesæt, dvs. sådan her:

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]

Se nu, hvordan du kan gøre det samme med et aggregat med vinduer:

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

Meget nemmere og renere, ikke?



  1. ODBC-adgang fra Windows Server Core

  2. 2 måder at få referatet fra en DateTime-værdi i Oracle Database

  3. Hvordan får man slutningen på en dag?

  4. SQL Server Database Snapshots -1