Masalah:
Anda ingin membandingkan peringkat yang dihasilkan oleh RANK
dan DENSE_RANK
dan menambahkannya sebagai kolom baru ke tabel.
Contoh:
Basis data kami memiliki tabel bernama sales_assistant
dengan data pada kolom berikut:id
(kunci utama), first_name
, last_name
, month
, dan sold products
.
id | nama_depan | nama_belakang | bulan | produk yang terjual |
---|---|---|---|---|
1 | Lisa | Hitam | 5 | 2300 |
2 | Maria | Yakub | 5 | 2400 |
3 | Lisa | Hitam | 6 | 2700 |
4 | Maria | Yakub | 6 | 2700 |
5 | Alex | Smith | 6 | 2900 |
6 | Maria | Yakub | 7 | 1200 |
7 | Lisa | Hitam | 7 | 1200 |
8 | Alex | Smith | 7 | 1000 |
Mari kita tampilkan nama depan dan belakang setiap asisten penjualan dan jumlah produk yang terjual. Kami juga ingin memeringkatnya berdasarkan jumlah produk yang terjual dalam urutan menurun.
Solusi 1:
SELECT RANK() OVER(ORDER BY menjual produk DESC) AS r, DENSE_RANK() OVER(ORDER BY menjual produk DESC) AS dr, first_name, last_name, bulan, produk yang terjualFROM sales_assistant;
Kueri ini mengembalikan dua peringkat:satu dihasilkan oleh RANK
dan satu lagi dengan DENSE_RANK
. Apa bedanya?
Sederhananya, RANK
melewatkan jumlah posisi setelah catatan dengan nomor peringkat yang sama. Peringkat RANK_DENSE
mengembalikan nomor posisi dari 1 hingga 6 karena tidak melewatkan catatan dengan nomor peringkat yang sama:
r | dr | nama_depan | nama_belakang | bulan | produk yang terjual |
---|---|---|---|---|---|
1 | 1 | Alex | Smith | 6 | 2900 |
2 | 2 | Lisa | Hitam | 6 | 2700 |
2 | 2 | Maria | Yakub | 6 | 2700 |
4 | 3 | Maria | Yakub | 5 | 2400 |
5 | 4 | Lisa | Hitam | 5 | 2300 |
6 | 5 | Maria | Yakub | 7 | 1200 |
6 | 5 | Lisa | Hitam | 7 | 1200 |
8 | 6 | Alex | Smith | 7 | 1000 |
Diskusi:
Jika Anda ingin memberi peringkat baris dalam kumpulan hasil, SQL menawarkan RANK()
dan DENSE_RANK
fungsi. Fungsi-fungsi ini digunakan di SELECT
dengan kolom lainnya. Setelah RANK
atau DENSE_RANK
, kami memanggil OVER()
fungsi, yang mengambil ORDER BY
klausa dengan nama kolom yang akan diurutkan sebelum menetapkan peringkat.
Tidak seperti DENSE_RANK
, RANK
melompati posisi setelah peringkat yang sama. Jumlah posisi yang dilewati tergantung pada berapa banyak baris yang memiliki peringkat yang sama. Misalnya, Mary dan Lisa menjual jumlah produk yang sama dan keduanya menempati peringkat #2. Dengan RANK
, posisi selanjutnya adalah #4; dengan DENSE_RANK
, posisi selanjutnya adalah #3.
Keduanya RANK
dan RANK_DENSE
bekerja pada partisi data:
Solusi 1:
SELECT RANK() OVER(PARTITION BY month ORDER BY sold product DESC) AS r, DENSE_RANK() OVER(PARTITION BY month ORDER BY sold products DESC) AS dr, first_name, last_name, month, sold productsFROM sales_assistant;Anda dapat membagi catatan ke dalam grup sesuai dengan kolom yang diberikan (dalam contoh kami,
month
). Dalam situasi ini, catatan diurutkan sebagai bagian dari partisi:
r | dr | nama_depan | nama_belakang | bulan | produk yang terjual |
---|---|---|---|---|---|
1 | 1 | Maria | Yakub | 5 | 2400 |
2 | 2 | Lisa | Hitam | 5 | 2300 |
1 | 1 | Alex | Smith | 6 | 2900 |
2 | 2 | Lisa | Hitam | 6 | 2700 |
2 | 2 | Maria | Yakub | 6 | 2700 |
1 | 1 | Maria | Yakub | 7 | 1200 |
1 | 1 | Lisa | Hitam | 7 | 1200 |
3 | 2 | Alex | Smith | 7 | 1000 |