możesz użyj GROUP BY SalesOrderID
. Różnica polega na tym, że dzięki funkcji GROUP BY możesz mieć tylko zagregowane wartości dla kolumn, które nie są zawarte w GROUP BY.
W przeciwieństwie do tego, używając okienkowych funkcji agregujących zamiast funkcji GROUP BY, można pobrać zarówno wartości zagregowane, jak i niezagregowane. Oznacza to, że chociaż nie robisz tego w przykładowym zapytaniu, możesz pobrać zarówno pojedyncze OrderQty
wartości i ich sumy, liczby, średnie itp. w grupach o tym samym SalesOrderID
s.
Oto praktyczny przykład tego, dlaczego agregaty okienkowe są świetne. Załóżmy, że musisz obliczyć, jaki procent sumy stanowi każda wartość. Bez agregacji okienkowych musiałbyś najpierw utworzyć listę zagregowanych wartości, a następnie dołączyć ją z powrotem do oryginalnego zestawu wierszy, tj. tak:
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]
Teraz spójrz, jak możesz zrobić to samo z agregatem okienkowym:
SELECT
[Partition],
Value,
Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig
O wiele łatwiej i czyściej, prawda?