USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, ProductID, OrderQty
,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'
,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Avg'
,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Count'
,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Min'
,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Max'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
Saya membaca tentang klausa itu dan saya tidak mengerti mengapa saya membutuhkannya. Apa fungsinya Over
? Apa yang Partitioning By
harus dilakukan Mengapa saya tidak dapat membuat kueri dengan menulis Group By SalesOrderID
?
mysql
sql
sql-server
aggregate-functions
clause
DenganFlyingColors
sumber
sumber
Jawaban:
Anda bisa menggunakannya
GROUP BY SalesOrderID
. Perbedaannya adalah, dengan GROUP BY Anda hanya dapat memiliki nilai gabungan 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. Yaitu, meskipun Anda tidak melakukan itu dalam contoh permintaan Anda, Anda bisa mengambil
OrderQty
nilai individual dan jumlah, jumlah, rata-rata dll. Di atas grup yang samaSalesOrderID
.Berikut adalah contoh praktis mengapa agregat berjendela sangat bagus. Misalkan Anda perlu menghitung berapa persen dari total setiap nilai. Tanpa agregat berjendela Anda harus terlebih dahulu mendapatkan daftar nilai agregat dan kemudian bergabung kembali ke rowset asli, yaitu seperti ini:
Sekarang lihat bagaimana Anda dapat melakukan hal yang sama dengan agregat berjendela:
Jauh lebih mudah dan bersih, bukan?
sumber
The
OVER
klausa di kuat bahwa Anda dapat memiliki agregat atas rentang yang berbeda ( "windowing"), apakah Anda menggunakanGROUP BY
atau tidakContoh: dapatkan jumlah per
SalesOrderID
dan jumlah semuaDapatkan berbeda
COUNT
, tidakGROUP BY
sumber
Jika Anda hanya ingin KELOMPOK OLEH SalesOrderID maka Anda tidak akan dapat memasukkan kolom ProductID dan OrderQty dalam klausa SELECT.
Klausa PARTITION BY BY memungkinkan Anda memecah fungsi agregat Anda. Satu contoh yang jelas dan berguna adalah jika Anda ingin menghasilkan nomor baris untuk baris pesanan pada pesanan:
(Sintaks saya mungkin sedikit tidak aktif)
Anda kemudian akan mendapatkan kembali sesuatu seperti:
sumber
Izinkan saya menjelaskan dengan sebuah contoh dan Anda akan dapat melihat cara kerjanya.
Dengan asumsi Anda memiliki tabel DIM_EQUIPMENT berikut:
Jalankan di bawah SQL
Hasilnya akan seperti di bawah ini
Lihat apa yang terjadi.
Anda dapat menghitung tanpa Group By pada YEAR dan Match dengan ROW.
CARA lain yang menarik untuk mendapatkan hasil yang sama jika seperti di bawah ini menggunakan DENGAN Klausa, DENGAN berfungsi sebagai in-line LIHAT dan dapat menyederhanakan kueri terutama yang kompleks, yang tidak terjadi di sini meskipun karena saya hanya mencoba untuk menunjukkan penggunaan
sumber
Klausa OVER ketika dikombinasikan dengan PARTITION BY menyatakan bahwa pemanggilan fungsi sebelumnya harus dilakukan secara analitis dengan mengevaluasi baris yang dikembalikan dari kueri. Anggap saja sebagai pernyataan GROUP BY inline.
OVER (PARTITION BY SalesOrderID)
menyatakan bahwa untuk fungsi SUM, AVG, dll ..., kembalikan nilai OVER subset rekaman yang dikembalikan dari kueri, dan PARTISI yang subset OLEH kunci asing SalesOrderID.Jadi kami akan SUM setiap record OrderQty untuk SETIAP SalesOrderID UNIK, dan nama kolom itu akan disebut 'Total'.
Ini adalah cara yang JAUH lebih efisien daripada menggunakan banyak tampilan inline untuk mengetahui informasi yang sama. Anda dapat menempatkan kueri ini dalam tampilan inline dan memfilter Total lalu.
sumber
Query Petition
Klausul.Mirip dengan
Group By
KlausaSintaks:
function (...) LEBIH DARI (PARTISI DENGAN col1 col3, ...)
Fungsi
COUNT()
,SUM()
,MIN()
,MAX()
, dllROW_NUMBER()
.RATION_TO_REOIRT()
, Dll.)Info lebih lanjut dengan contoh: http://msdn.microsoft.com/en-us/library/ms189461.aspx
sumber
Itu adalah hasil dari query. Tabel yang digunakan sebagai sumber adalah kecuali sama dengan tidak memiliki kolom terakhir. Kolom ini adalah jumlah bergerak dari yang ketiga.
Pertanyaan:
(tabel berlaku untuk publik.iuk)
Ini sedikit melebihi level dbase (1986), saya tidak tahu mengapa 25+ tahun diperlukan untuk menyelesaikannya.
sumber