Вие можете използвайте GROUP BY SalesOrderID
. Разликата е, че с GROUP BY можете да имате само обобщените стойности за колоните, които не са включени в GROUP BY.
За разлика от това, като използвате прозоречни агрегатни функции вместо GROUP BY, можете да извлечете както агрегирани, така и неагрегирани стойности. Тоест, въпреки че не правите това в примерната си заявка, можете да извлечете и двата отделни OrderQty
стойности и техните суми, брои, средни и т.н. върху групи от един и същ SalesOrderID
с.
Ето един практически пример за това защо агрегатите с прозорци са страхотни. Да предположим, че трябва да изчислите какъв процент от общата сума е всяка стойност. Без агрегати с прозоречни агрегати първо ще трябва да извлечете списък с обобщени стойности и след това да го присъедините обратно към оригиналния набор от редове, т.е. така:
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]
Сега вижте как можете да направите същото с агрегат с прозорец:
SELECT
[Partition],
Value,
Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig
Много по-лесно и по-чисто, нали?