Вы можете использовать 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
Намного проще и чище, не так ли?