RANK vs DENSE_RANK pada Nilai Seri
Pertanyaan klasik tentang pemeringkatan dengan celah atau tanpa celah saat nilai sama.
RANK vs DENSE_RANK pada Nilai Seri adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Tiga Fungsi Pemeringkatan Berdampingan
SQL menyediakan tiga fungsi jendela untuk pemeringkatan, dan pertanyaan tentang jendela yang paling sering diajukan adalah bagaimana ketiganya berbeda saat terjadi seri:
- ROW_NUMBER — selalu unik; nilai seri mendapat nomor berbeda secara sembarang.
- RANK — nilai seri berbagi peringkat, lalu peringkat berikutnya melompat (meninggalkan celah).
- DENSE_RANK — nilai seri berbagi peringkat, lalu peringkat berikutnya tidak melompat (tanpa celah).
Kemampuan menyebutkan perbedaan ini dengan cepat merupakan indikator wawancara yang andal.
Tabel Contoh Konkret
Bayangkan lima skor yang diurutkan secara menurun: 100, 90, 90, 80, 70. Perhatikan bagaimana setiap fungsi memberi nomor pada skor tersebut.
- ROW_NUMBER: 1, 2, 3, 4, 5
- RANK: 1, 2, 2, 4, 5 (melompati 3 setelah seri)
- DENSE_RANK: 1, 2, 2, 3, 4 (tanpa lompatan)
Hafalkan contoh 100/90/90/80/70 ini — contoh tersebut langsung menjawab pertanyaan itu.
SELECT
score,
ROW_NUMBER() OVER (ORDER BY score DESC) AS rownum,
RANK() OVER (ORDER BY score DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense
FROM scores;Cara RANK Menghitung Celah
RANK menetapkan peringkat setiap baris yang sama dengan satu ditambah jumlah baris yang secara ketat mendahuluinya dalam urutan tersebut. Dua baris yang seri pada nilai 90 masing-masing didahului oleh satu baris (100), sehingga keduanya mendapat peringkat 2. Nilai berikutnya yang lebih rendah didahului oleh tiga baris, sehingga langsung mendapat peringkat 4.
Itulah sebabnya RANK mencerminkan sistem penilaian kompetisi: para peraih medali perak yang seri, tanpa medali perunggu.
-- scores 100,90,90,80 -> RANK = 1,2,2,4
SELECT score, RANK() OVER (ORDER BY score DESC) AS rnk
FROM scores;Cara DENSE_RANK Menghindari Celah
DENSE_RANK menetapkan peringkat yang sama dengan satu ditambah jumlah nilai berbeda yang mendahului nilai saat ini. Setelah seri pada nilai 90, hanya ada dua nilai berbeda yang mendahului nilai 80 (100 dan 90), sehingga nilai tersebut mendapat peringkat 3 — tanpa celah.
Gunakan DENSE_RANK ketika Anda memperhatikan posisi nilai berbeda, seperti "gaji tertinggi kedua" ketika nilai seri harus dihitung satu kali.
-- scores 100,90,90,80 -> DENSE_RANK = 1,2,2,3
SELECT score, DENSE_RANK() OVER (ORDER BY score DESC) AS dense
FROM scores;Kapan Memilih Setiap Fungsi
Panduan keputusan singkat yang biasanya ingin didengar pewawancara:
- Perlu tepat satu baris untuk setiap posisi (catatan terbaru, penomoran halaman)? → ROW_NUMBER.
- Perlu klasemen yang menempatkan nilai sama pada peringkat yang sama dan menangani lompatan peringkat dengan benar (peringkat olahraga, 3 teratas termasuk nilai sama)? → RANK.
- Perlu nilai berbeda ke-N (gaji tertinggi ke-N)? → DENSE_RANK.
Pilihan yang salah mengubah baris yang dikembalikan, jadi jelaskan alasan pilihan Anda secara lisan.
Pemeringkatan Dalam Partisi
Ketiga fungsi menerima PARTITION BY untuk melakukan pemeringkatan secara terpisah di dalam setiap grup. Setiap partisi dimulai kembali dari peringkat 1.
Di sini, setiap departemen memeringkat karyawannya sendiri berdasarkan gaji, dengan nilai sama ditangani oleh DENSE_RANK. Karyawan dengan gaji tertinggi di setiap departemen mendapat peringkat 1, dan karyawan dengan gaji yang sama berbagi peringkat.
SELECT
department,
name,
salary,
DENSE_RANK() OVER (
PARTITION BY department
ORDER BY salary DESC
) AS salary_rank
FROM employees;Contoh Lengkap: 3 Teratas Termasuk Nilai Sama
"Kembalikan 3 gaji tertinggi per departemen, dan jika beberapa orang memiliki gaji yang sama pada posisi ketiga, sertakan semuanya." Ini memerlukan RANK atau DENSE_RANK, bukan ROW_NUMBER.
Menggunakan DENSE_RANK <= 3 mempertahankan tiga tingkat gaji berbeda teratas dan setiap karyawan pada tingkat tersebut — tepat seperti arti "termasuk nilai sama".
SELECT department, name, salary, salary_rank
FROM (
SELECT department, name, salary,
DENSE_RANK() OVER (
PARTITION BY department ORDER BY salary DESC
) AS salary_rank
FROM employees
) t
WHERE salary_rank <= 3;Contoh Lengkap: Gaji Tertinggi Kedua
Ini adalah pertanyaan wawancara SQL yang paling terkenal. Jawaban yang andal menggunakan DENSE_RANK agar gaji tertinggi yang sama tidak membuat nilai tertinggi kedua yang sebenarnya menjadi tidak terjangkau.
Jika tiga orang menerima gaji maksimum, DENSE_RANK = 2 tetap mengidentifikasi gaji berbeda berikutnya dengan benar, sedangkan ROW_NUMBER = 2 hanya akan mengembalikan orang lain dengan gaji tertinggi.
SELECT DISTINCT salary AS second_highest
FROM (
SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS dr
FROM employees
) t
WHERE dr = 2;RANK vs DENSE_RANK untuk 'Nilai Tertinggi ke-N'
Mengapa menggunakan DENSE_RANK, bukan RANK, untuk soal nilai tertinggi ke-N? Karena RANK menyisakan celah. Dengan gaji 100, 100, 90, nilai 90 memiliki RANK = 3, tetapi DENSE_RANK = 2.
Jika pertanyaannya meminta "gaji berbeda tertinggi ke-2", penyaringan dengan RANK = 2 tidak akan mengembalikan apa pun, sedangkan DENSE_RANK = 2 dengan benar mengembalikan 90. Selalu hubungkan "nilai berbeda ke-N" dengan DENSE_RANK.
-- salaries 100,100,90
-- RANK: 1,1,3 -> WHERE rank = 2 returns NOTHING
-- DENSE_RANK: 1,1,2 -> WHERE dense_rank = 2 returns 90Catatan Lintas Dialek
Kabar baik: ROW_NUMBER, RANK, dan DENSE_RANK merupakan bagian dari standar SQL dan berperilaku sama di PostgreSQL, SQL Server, Oracle, MySQL 8+, BigQuery, dan Snowflake. Aturan penanganan nilai sama di atas berlaku secara universal.
Satu fungsi terkait, PERCENT_RANK, dibangun berdasarkan RANK untuk memberikan posisi relatif dari 0 hingga 1 — layak disebutkan jika pewawancara bertanya tentang pemeringkatan persentil.
Kesalahan Umum
Perhatikan hal-hal berikut:
- Menggunakan
ROW_NUMBERuntuk "nilai tertinggi ke-N" sehingga baris dengan nilai sama terlewat. - Menggunakan
RANKketika pertanyaannya mengacu pada nilai berbeda, lalu mendapatkan hasil kosong karena adanya celah. - Melupakan
ORDER BYdi dalamOVER— pemeringkatan tidak bermakna tanpanya. - Menyaring hasil pemeringkatan secara langsung di
WHERE, bukan dalam kueri luar.
Pemeriksaan Cepat
Terapkan aturan nilai sama.
Ringkasan: Dengan Celah vs Tanpa Celah
Sekarang Anda dapat memilih fungsi pemeringkatan yang tepat secara cepat:
- ROW_NUMBER: angka unik, tidak ada peringkat yang sama.
- RANK: nilai sama berbagi peringkat, lalu muncul celah (1,2,2,4).
- DENSE_RANK: nilai sama berbagi peringkat, tanpa celah (1,2,2,3).
- "Nilai berbeda tertinggi ke-N" →
DENSE_RANK; "N teratas termasuk nilai sama" →RANK/DENSE_RANK; "tepat satu baris per posisi" →ROW_NUMBER.
Berikutnya: cara benar-benar menyaring hasil jendela, karena Anda tidak dapat melakukannya di WHERE.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “RANK vs DENSE_RANK pada Nilai Seri” gratis?
Ya — teks lengkap “RANK vs DENSE_RANK pada Nilai Seri” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “RANK vs DENSE_RANK pada Nilai Seri”?
Pertanyaan klasik tentang pemeringkatan dengan celah atau tanpa celah saat nilai sama. Kamu berlatih SQL Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai SQL Interview Prep?
Tidak diperlukan pengalaman sebelumnya. SQL Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “RANK vs DENSE_RANK pada Nilai Seri” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Interview Prep ini?
Ya. Setiap pelajaran SQL Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- OVER, PARTITION BY, dan ORDER BY
- ROW_NUMBER untuk Pengurutan Unik
- RANK vs DENSE_RANK pada Nilai Seri
- Memfilter Hasil Jendela