Anda bisa gunakan GROUP BY SalesOrderID
. Perbedaannya adalah, dengan GROUP BY Anda hanya dapat memiliki nilai agregat untuk kolom yang tidak termasuk dalam GROUP BY.
Sebaliknya, menggunakan fungsi agregat berjendela alih-alih GROUP BY, Anda dapat mengambil nilai agregat dan non-agregat. Artinya, meskipun Anda tidak melakukannya dalam kueri contoh, Anda dapat mengambil OrderQty
individu nilai dan jumlah, hitungan, rata-rata, dll. pada grup SalesOrderID
yang sama s.
Berikut adalah contoh praktis mengapa agregat berjendela bagus. Misalkan Anda perlu menghitung berapa persen dari total setiap nilai. Tanpa agregat berjendela, Anda harus terlebih dahulu mendapatkan daftar nilai agregat dan kemudian menggabungkannya kembali ke rowset asli, yaitu seperti ini:
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]
Sekarang lihat bagaimana Anda dapat melakukan hal yang sama dengan agregat berjendela:
SELECT
[Partition],
Value,
Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig
Jauh lebih mudah dan bersih, bukan?