Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kapan dan bagaimana menggunakan klausa SQL PARTITION BY

Dalam artikel ini, kita akan mengeksplorasi kapan dan bagaimana menggunakan klausa SQL PARTITION BY dan membandingkannya dengan menggunakan klausa GROUP BY.

Memahami fungsi Jendela

Pengguna database menggunakan fungsi agregat seperti MAX(), MIN(), AVERAGE() dan COUNT() untuk melakukan analisis data. Fungsi-fungsi ini beroperasi di seluruh tabel dan mengembalikan data agregat tunggal menggunakan klausa GROUP BY. Terkadang, kami memerlukan nilai agregat pada sekumpulan kecil baris. Dalam hal ini, fungsi Window dikombinasikan dengan fungsi agregat membantu mencapai output yang diinginkan. Fungsi Window menggunakan klausa OVER(), dan dapat mencakup fungsi-fungsi berikut:

  • Partisi Oleh:  Ini membagi baris atau kumpulan hasil kueri ke dalam partisi kecil.
  • Pesan Berdasarkan:  Ini mengatur baris dalam urutan menaik atau menurun untuk jendela partisi. Urutan default adalah menaik.
  • Baris atau Rentang:  Anda selanjutnya dapat membatasi baris dalam partisi dengan menentukan titik awal dan titik akhir.

Pada artikel ini, kita akan fokus untuk mengeksplorasi klausa SQL PARTITION BY.

Menyiapkan sampel data

Misalkan kita memiliki tabel [SalesLT].[Orders] yang menyimpan detail pesanan pelanggan. Ini memiliki kolom [Kota] yang menentukan kota pelanggan tempat pesanan ditempatkan.

CREATE TABLE [SalesLT].[Orders]
(
orderid INT,
orderdate DATE,
customerName VARCHAR(100),
City VARCHAR(50),
amount MONEY
)
INSERT INTO [SalesLT].[Orders]
SELECT 1,'01/01/2021','Mohan Gupta','Alwar',10000
UNION ALL
SELECT 2,'02/04/2021','Lucky Ali','Kota',20000
UNION ALL
SELECT 3,'03/02/2021','Raj Kumar','Jaipur',5000
UNION ALL
SELECT 4,'04/02/2021','Jyoti Kumari','Jaipur',15000
UNION ALL
SELECT 5,'05/03/2021','Rahul Gupta','Jaipur',7000
UNION ALL
SELECT 6,'06/04/2021','Mohan Kumar','Alwar',25000
UNION ALL
SELECT 7,'07/02/2021','Kashish Agarwal','Alwar',15000
UNION ALL
SELECT 8,'08/03/2021','Nagar Singh','Kota',2000
UNION ALL
SELECT 9,'09/04/2021','Anil KG','Alwar',1000
Go

Katakanlah kita ingin mengetahui nilai total pesanan berdasarkan lokasi (Kota). Untuk tujuan ini, kami menggunakan fungsi SUM() dan GROUP BY seperti yang ditunjukkan di bawah ini.

SELECT City AS CustomerCity
,sum(amount) AS totalamount FROM [SalesLT].[Orders]
GROUP BY city
ORDER BY city

Di kumpulan hasil, kami tidak dapat menggunakan kolom non-agregat dalam pernyataan SELECT. Misalnya, kita tidak dapat menampilkan [NamaPelanggan] di output karena tidak termasuk dalam klausa GROUP BY.

SQL Server memberikan pesan kesalahan berikut jika Anda mencoba menggunakan kolom non-agregat dalam daftar kolom.

SELECT City AS CustomerCity, CustomerName,amount,
SUM(amount) OVER(PARTITION BY city) TotalOrderAmount
FROM [SalesLT].[Orders]

Seperti yang ditunjukkan di bawah ini, klausa PARTITION BY membuat jendela yang lebih kecil (kumpulan baris data), melakukan agregasi dan menampilkannya. Anda juga dapat melihat kolom non-agregat dalam output ini.

Demikian pula, Anda dapat menggunakan fungsi AVG(), MIN(), MAX() untuk menghitung jumlah rata-rata, minimum, dan maksimum dari baris dalam sebuah jendela.

SELECT City AS CustomerCity, CustomerName,amount,
SUM(amount) OVER(PARTITION BY city) TotalOrderAmount,
Avg(amount) OVER(PARTITION BY city) AvgOrderAmount,
Min(amount) OVER(PARTITION BY city) MinOrderAmount,
MAX(amount) OVER(PARTITION BY city) MaxOrderAmount
FROM [SalesLT].[Orders]

Menggunakan klausa SQL PARTITION BY dengan fungsi ROW_NUMBER()

Sebelumnya, kami mendapatkan nilai agregat di jendela menggunakan klausa PARTITION BY. Misalkan alih-alih total, kita memerlukan total kumulatif dalam sebuah partisi.

Total kumulatif bekerja dengan cara berikut.

Baris Total kumulatif
1 Peringkat 1+ 2
2 Peringkat 2+3
3 Peringkat 3+4

Peringkat baris dihitung menggunakan fungsi ROW_NUMBER(). Pertama-tama mari kita gunakan fungsi ini dan lihat peringkat baris.

  • Fungsi ROW_NUMBER() menggunakan klausa OVER dan PARTITION BY dan mengurutkan hasil dalam urutan menaik atau menurun. Ini memulai peringkat baris dari 1 per urutan penyortiran.
SELECT City AS CustomerCity, CustomerName,amount,
ROW_NUMBER() OVER(PARTITION BY city ORDER BY amount DESC) AS [Row Number]
FROM [SalesLT].[Orders]

Misalnya, di kota [Alwar], baris dengan jumlah tertinggi (25000.00) ada di baris 1. Seperti yang ditunjukkan di bawah, baris diurutkan di jendela yang ditentukan oleh klausa PARTITION BY. Misalnya, kami memiliki tiga kota yang berbeda [Alwar], [Jaipur] dan [Kota], dan setiap jendela (kota) mendapatkan peringkat barisnya.

Untuk menghitung total kumulatif, kami menggunakan argumen berikut.

  • BARIS LANCAR:Ini menentukan titik awal dan akhir dalam rentang yang ditentukan.
  • 1 berikut:Ini menentukan jumlah baris (1) untuk diikuti dari baris saat ini.
SELECT City AS CustomerCity, CustomerName,amount,
ROW_NUMBER() OVER(PARTITION BY city ORDER BY amount DESC) AS [Row Number],
SUM(amount) OVER(PARTITION BY city ORDER BY amount DESC ROWS BETWEEN
CURRENT ROW AND 1 FOLLOWING) AS CumulativeSUM
FROM [SalesLT].[Orders]

Gambar berikut menunjukkan bahwa Anda mendapatkan total kumulatif alih-alih total keseluruhan di jendela yang ditentukan oleh klausa PARTITION BY.

Jika kami menggunakan ROWS UNBOUNDED PRECEDING  dalam klausa SQL PARTITION BY, ia menghitung total kumulatif dengan cara berikut. Ini menggunakan baris saat ini bersama dengan baris yang memiliki nilai tertinggi di jendela yang ditentukan.

Baris Total kumulatif
1 Peringkat 1
2 Peringkat 1+2
3 Peringkat 1+2+3
SELECT City AS CustomerCity, CustomerName,amount,
ROW_NUMBER() OVER(PARTITION BY city ORDER BY amount DESC) AS [Row Number],
SUM(amount) OVER(PARTITION BY city ORDER BY amount DESC
ROWS UNBOUNDED PRECEDING) AS CumulativeSUM
FROM [SalesLT].[Orders]

Membandingkan klausa GROUP BY dan SQL PARTITION BY

GROUP BY PARTISI OLEH
Ini mengembalikan satu baris per grup setelah menghitung nilai agregat. Ini mengembalikan semua baris dari pernyataan SELECT bersama dengan kolom tambahan dari nilai agregat.
Kami tidak dapat menggunakan kolom non-agregat dalam pernyataan SELECT. Kita dapat menggunakan kolom yang diperlukan dalam pernyataan SELECT, dan itu tidak menghasilkan kesalahan apa pun untuk kolom non-agregat.
Ini memerlukan penggunaan klausa HAVING untuk memfilter catatan dari pernyataan SELECT. Fungsi PARTITION dapat memiliki predikat tambahan dalam klausa WHERE selain dari kolom yang digunakan dalam pernyataan SELECT.
GROUP BY digunakan dalam agregat biasa. PARTITION BY digunakan dalam agregat berjendela.
Kami tidak dapat menggunakannya untuk menghitung nomor baris atau peringkatnya. Ini dapat menghitung nomor baris dan peringkatnya di jendela yang lebih kecil.

Menggunakannya

Direkomendasikan untuk menggunakan klausa SQL PARTITION BY saat bekerja dengan beberapa grup data untuk nilai agregat dalam grup individual. Demikian pula, ini dapat digunakan untuk melihat baris asli dengan kolom tambahan dari nilai agregat.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa melakukan pemicu SEBELUM DIPERBARUI dengan sql server?

  2. SQL, Bagaimana Menggabungkan hasil?

  3. Bagaimana membandingkan datetime dengan hanya tanggal di SQL Server

  4. Peningkatan indeks otomatis untuk Microsoft SQL Server 2008 R2

  5. Bagaimana cara memasukkan karakter Arab ke dalam database SQL?