Penjelasan sederhana
RANK dan DENSE_RANK memberi peringkat seperti klasemen lomba. Nilai yang sama mendapat peringkat yang sama.
Bedanya ada setelah posisi seri. RANK melompati nomor berikutnya, seperti lomba lari: kalau dua orang juara 2, berikutnya juara 4. DENSE_RANK tidak melompat: setelah dua juara 2, berikutnya juara 3.
Sintaks
RANK() OVER (ORDER BY kolom DESC)
DENSE_RANK() OVER (ORDER BY kolom DESC)
| Bagian | Keterangan |
|---|---|
RANK | Peringkat dengan lompatan: 1, 2, 2, 4. |
DENSE_RANK | Peringkat tanpa lompatan: 1, 2, 2, 3. |
Tanda [kurung siku] berarti bagian opsional. Kata kunci SQL tidak membedakan huruf besar-kecil, tapi menulisnya dengan huruf besar membuat query lebih mudah dibaca.
Contoh RANK & DENSE_RANK
Data contoh: karyawan
Tabel karyawan
| id | nama | dept_id | kota | gaji | tgl_masuk | atasan_id |
|---|---|---|---|---|---|---|
| 1 | Andi Pratama | 3 | Bandung | 12500000 | 2019-03-11 | NULL |
| 2 | Bunga Lestari | 1 | Jakarta | 9800000 | 2020-07-01 | NULL |
| 3 | Candra Wijaya | 3 | Bandung | 8200000 | 2021-02-15 | 1 |
| 4 | Dewi Anggraini | 2 | Jakarta | 7500000 | 2022-05-09 | 6 |
| 5 | Eko Saputra | 1 | Jakarta | 6900000 | 2023-01-16 | 2 |
| 6 | Fajar Nugroho | 2 | Surabaya | 11000000 | 2018-09-03 | NULL |
| 7 | Gita Permata | 3 | Jakarta | 8200000 | 2023-08-21 | 1 |
| 8 | Hendra Gunawan | NULL | Medan | 5500000 | 2024-04-02 | NULL |
SELECT nama, gaji,
RANK() OVER (ORDER BY gaji DESC) AS peringkat,
DENSE_RANK() OVER (ORDER BY gaji DESC) AS peringkat_dense
FROM karyawan;
Hasil 8 baris
| nama | gaji | peringkat | peringkat_dense |
|---|---|---|---|
| Andi Pratama | 12500000 | 1 | 1 |
| Fajar Nugroho | 11000000 | 2 | 2 |
| Bunga Lestari | 9800000 | 3 | 3 |
| Candra Wijaya | 8200000 | 4 | 4 |
| Gita Permata | 8200000 | 4 | 4 |
| Dewi Anggraini | 7500000 | 6 | 5 |
| Eko Saputra | 6900000 | 7 | 6 |
| Hendra Gunawan | 5500000 | 8 | 7 |
Candra dan Gita sama-sama bergaji 8,2 juta sehingga berbagi peringkat 4. Setelahnya RANK melompat ke 6, sedangkan DENSE_RANK lanjut ke 5.
Cara kerjanya, langkah demi langkah
ORDER BY gaji DESC: 8 karyawan diurutkan dari gaji terbesar.- Andi peringkat 1, Fajar 2, Bunga 3.
- Candra dan Gita sama-sama bergaji 8.200.000, jadi keduanya berbagi peringkat 4.
- Dewi berikutnya:
RANKmemberinya 6 (karena posisi 5 sudah "terpakai"), sedangkanDENSE_RANKmemberinya 5.
Dipakai untuk apa di kantor?
- Peringkat sales berdasarkan omzet.
- Peringkat nilai peserta pelatihan.
- Mencari 3 harga tertinggi yang berbeda dengan
DENSE_RANK <= 3.
Kesalahan yang sering terjadi
- Memakai
RANKuntuk mengambil "Top 3" lalu kaget hasilnya lebih dari 3 baris karena ada yang seri. Itu memang perilaku yang benar.
Running Total (SUM OVER)