Menangani Nilai Seri dalam Top-N
Kapan menggunakan RANK atau DENSE_RANK agar semua baris dengan nilai seri tetap disertakan.
Menangani Nilai Seri dalam Top-N adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 2 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 Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.
Pertanyaan Lanjutan tentang Nilai Sama
Setelah menguasai N teratas dengan ROW_NUMBER, pewawancara mengajukan pertanyaan lanjutan yang menjebak: "Bagaimana jika dua karyawan memiliki gaji yang persis sama pada batas? Apakah keduanya harus disertakan?"
Hal ini membedakan kandidat yang menghafalkan satu kueri dari kandidat yang memahami makna peringkat. Jawabannya bergantung pada pilihan antara ROW_NUMBER, RANK, dan DENSE_RANK. Pelajaran ini memetakan setiap fungsi ke tujuan bisnisnya.
ROW_NUMBER Menyembunyikan Nilai Sama
ROW_NUMBER memberikan bilangan bulat yang benar-benar unik untuk setiap baris. Bahkan ketika dua baris memiliki nilai yang sama pada kolom pengurutan, salah satunya mendapatkan 2 dan yang lainnya mendapatkan 3 dalam urutan yang sewenang-wenang.
Akibatnya, penyaring WHERE rn <= 3 mengembalikan tepat 3 baris dan dapat secara diam-diam menghapus baris bernilai sama yang sebenarnya layak disertakan. Hal ini tepat jika Anda memang menginginkan jumlah tetap, tetapi keliru jika semua nilai yang sama seharusnya memenuhi syarat.
-- Salaries: 100, 90, 90, 80
-- ROW_NUMBER -> 1, 2, 3, 4 (the two 90s get 2 and 3 arbitrarily)
ROW_NUMBER() OVER (ORDER BY salary DESC)RANK Menyisakan Lompatan
RANK memberikan peringkat yang sama kepada baris bernilai sama, lalu melewati nilai berikutnya untuk memperhitungkan nilai yang sama tersebut. Dua baris yang sama-sama berada di peringkat 2 akan mendapatkan 2, dan baris berikutnya langsung mendapatkan peringkat 4, bukan 3.
Gunakan RANK ketika Anda menginginkan "3 posisi teratas" dan satu posisi dapat ditempati beberapa orang, seperti klasemen kompetisi nyata ketika dua peraih medali perak berarti tidak ada peraih medali perunggu.
-- Salaries: 100, 90, 90, 80
-- RANK -> 1, 2, 2, 4 (rank 3 is skipped)
RANK() OVER (ORDER BY salary DESC)DENSE_RANK Tanpa Lompatan
DENSE_RANK juga memberikan peringkat yang sama kepada baris bernilai sama, tetapi tidak melewati peringkat setelahnya. Dua baris yang sama-sama berada di peringkat 2 akan mendapatkan 2, dan nilai berbeda berikutnya mendapatkan 3.
Gunakan DENSE_RANK ketika pertanyaannya berkaitan dengan nilai unik: "3 tingkat gaji unik tertinggi" atau "3 tingkat harga teratas". Fungsi ini menghitung nilai unik, bukan baris.
-- Salaries: 100, 90, 90, 80
-- DENSE_RANK -> 1, 2, 2, 3 (no gap)
DENSE_RANK() OVER (ORDER BY salary DESC)Perbandingan Berdampingan
Untuk daftar gaji 100, 90, 90, 80, ketiga fungsi tersebut menghasilkan:
- ROW_NUMBER: 1, 2, 3, 4
- RANK: 1, 2, 2, 4
- DENSE_RANK: 1, 2, 2, 3
Tabel ini layak dihafalkan di luar kepala. Pewawancara mungkin hanya meminta Anda melengkapinya untuk daftar tertentu, dan memahami perilaku lompatan dengan benar adalah inti pertanyaannya.
SELECT salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn,
RANK() OVER (ORDER BY salary DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employees;Sertakan Semua Baris Bernilai Sama dengan RANK
Untuk menjawab "3 teratas, tetapi sertakan semua orang yang memiliki nilai sama di batas", lakukan penyaringan pada RANK() <= 3. Jika dua orang berbagi peringkat 3, keduanya akan muncul, sehingga hasilnya dapat berisi lebih dari 3 baris.
Inilah maksud pertanyaan yang menggunakan frasa "3 posisi teratas", bukan "sembarang 3 baris". Nyatakan secara jelas bahwa jumlah baris dapat melebihi N ketika terdapat nilai yang sama.
WITH ranked AS (
SELECT name, department, salary,
RANK() OVER (
PARTITION BY department ORDER BY salary DESC
) AS rnk
FROM employees
)
SELECT name, department, salary, rnk
FROM ranked
WHERE rnk <= 3
ORDER BY department, rnk;Tiga Tingkat Unik Teratas dengan DENSE_RANK
Ketika persyaratannya adalah "3 tingkat gaji unik tertinggi" dan Anda ingin setiap karyawan pada ketiga tingkat tersebut, gunakan DENSE_RANK() <= 3.
Hasilnya dapat berisi banyak baris: semua karyawan dalam tiga tingkat gaji teratas, seberapa pun banyaknya karyawan pada tingkat tersebut. Inti pentingnya adalah bahwa DENSE_RANK menghitung nilai unik, sehingga penyaring memilih tingkatan nilai, bukan jumlah baris yang tetap.
WITH ranked AS (
SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employees
)
SELECT name, salary, drnk
FROM ranked
WHERE drnk <= 3
ORDER BY drnk;Panduan Pengambilan Keputusan
Petakan kata-kata dalam pertanyaan ke fungsi yang sesuai:
- "Tepat N baris" atau paginasi →
ROW_NUMBER(tambahkan penentu seri). - "N posisi teratas, nilai sama berbagi satu posisi" →
RANK. - "N nilai / tingkat / tingkatan unik teratas" →
DENSE_RANK.
Jika spesifikasinya ambigu, tanyakan: "Jika ada nilai yang sama pada batas, apakah saya harus menyertakan semua baris bernilai sama atau membatasi hasil pada N baris?" Pertanyaan klarifikasi itu sendiri dapat memberi Anda nilai tambahan.
Penentu Seri Tetap Penting
Bahkan dengan RANK atau DENSE_RANK, menambahkan kunci ORDER BY sekunder mengendalikan urutan tampilan baris bernilai sama dan menjaga keluaran tetap stabil. Hal ini tidak mengubah baris mana yang memenuhi syarat, tetapi membuat hasil dapat direproduksi.
Dengan ROW_NUMBER, penentu seri sangat penting karena menentukan baris bernilai sama mana yang tetap bertahan setelah penyaringan rn.
RANK() OVER (
PARTITION BY department
ORDER BY salary DESC, name ASC
) AS rnkContoh Terapan: Pencetak Skor Tertinggi
Tabel game_scores memiliki player dan score. Pewawancara menginginkan "semua pemain dalam 2 posisi skor teratas". Nilai sama di posisi pertama berarti dua pemain berada di posisi 1, lalu skor unik berikutnya berada di posisi 2.
"Posisi" tanpa lompatan setelah nilai yang sama menunjukkan penggunaan DENSE_RANK. Jika mereka mengatakan "2 posisi teratas dalam klasemen dengan lompatan", Anda akan beralih ke RANK. Perhatikan frasa yang digunakan secara tepat.
WITH r AS (
SELECT player, score,
DENSE_RANK() OVER (ORDER BY score DESC) AS pos
FROM game_scores
)
SELECT player, score, pos
FROM r
WHERE pos <= 2
ORDER BY pos, player;Kesalahan Umum yang Harus Dihindari
Kesalahan yang diwaspadai pewawancara:
- Menggunakan
ROW_NUMBERketika pertanyaannya menginginkan semua nilai yang sama disertakan, sehingga baris yang memenuhi syarat terhapus tanpa disadari. - Keliru memahami perilaku lompatan pada
RANKdanDENSE_RANK. - Lupa bahwa penyaringan
RANK/DENSE_RANKdapat mengembalikan lebih dari N baris, lalu menyatakan bahwa hasil tersebut salah. - Menghilangkan
PARTITION BYketika N teratas diminta per grup, sehingga seluruh tabel diberi peringkat.
Pemeriksaan Singkat
Pilih fungsi pemeringkatan yang tepat sesuai perilaku nilai seri yang dijelaskan.
Meninjau Kembali: Menangani Nilai Seri
Tiga fungsi, tiga perilaku nilai seri:
- ROW_NUMBER: selalu unik, tepat N baris, nilai seri dipecahkan tanpa aturan khusus.
- RANK: nilai yang sama memiliki peringkat yang sama, lalu muncul celah.
- DENSE_RANK: nilai yang sama memiliki peringkat yang sama, tanpa celah, dan menghitung nilai yang berbeda.
Pilih berdasarkan kata-kata dalam pertanyaan, ajukan pertanyaan klarifikasi jika maknanya ambigu, dan ingat bahwa filter RANK/DENSE_RANK secara sengaja dapat mengembalikan lebih dari N baris.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menangani Nilai Seri dalam Top-N” gratis?
Ya — teks lengkap “Menangani Nilai Seri dalam Top-N” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding Interview Prep mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Menangani Nilai Seri dalam Top-N”?
Kapan menggunakan RANK atau DENSE_RANK agar semua baris dengan nilai seri tetap disertakan. Kamu berlatih Coding 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 Coding Interview Prep?
Tidak diperlukan pengalaman sebelumnya. Coding 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 2 dari 4.
Berapa lama pelajaran “Menangani Nilai Seri dalam Top-N” 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 Coding Interview Prep ini?
Ya. Setiap pelajaran Coding 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
- Baris Top-N Per Grup dengan ROW_NUMBER
- Menangani Nilai Seri dalam Top-N
- Menghapus Duplikat Baris dengan Aman
- Mempertahankan Baris Terbaru Per Kunci