0Pricing
SQL Interview Prep · Pelajaran

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 SQL 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 SQL Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL 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 rnk

Contoh 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_NUMBER ketika pertanyaannya menginginkan semua nilai yang sama disertakan, sehingga baris yang memenuhi syarat terhapus tanpa disadari.
  • Keliru memahami perilaku lompatan pada RANK dan DENSE_RANK.
  • Lupa bahwa penyaringan RANK/DENSE_RANK dapat mengembalikan lebih dari N baris, lalu menyatakan bahwa hasil tersebut salah.
  • Menghilangkan PARTITION BY ketika 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 SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL 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 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 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 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

  1. Baris Top-N Per Grup dengan ROW_NUMBER
  2. Menangani Nilai Seri dalam Top-N
  3. Menghapus Duplikat Baris dengan Aman
  4. Mempertahankan Baris Terbaru Per Kunci
← Kembali ke SQL Interview Prep