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 |