Du kan använd GROUP BY SalesOrderID
. Skillnaden är att med GROUP BY kan du bara ha de aggregerade värdena för de kolumner som inte ingår i GROUP BY.
Om du däremot använder fönsterade aggregerade funktioner istället för GROUP BY kan du hämta både aggregerade och icke-aggregerade värden. Det vill säga, även om du inte gör det i din exempelfråga, kan du hämta både individuella OrderQty
värden och deras summor, antal, medelvärden etc. över grupper av samma SalesOrderID
s.
Här är ett praktiskt exempel på varför fönstermaterial är bra. Anta att du behöver beräkna hur stor procent av en total varje värde är. Utan fönsterade aggregat måste du först härleda en lista med aggregerade värden och sedan koppla tillbaka den till den ursprungliga raduppsättningen, dvs så här:
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]
Titta nu på hur du kan göra samma sak med ett fönsterformat aggregat:
SELECT
[Partition],
Value,
Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig
Mycket enklare och renare, eller hur?