0Pricing
SQL Interview Prep · Pelajaran

Nilai Tertinggi ke-N dengan DENSE_RANK

Generalisasikan ke nilai unik ke-N dan tangani duplikat.

Nilai Tertinggi ke-N dengan DENSE_RANK 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.

Menggeneralisasi ke Nilai Tertinggi ke-N

Setelah Anda dapat menemukan gaji tertinggi kedua, pewawancara biasanya langsung menantang: "Sekarang berikan gaji tertinggi ke-N." Jawaban yang paling bersih dan mudah dipertanggungjawabkan menggunakan DENSE_RANK.

Polanya selalu sama: beri peringkat pada gaji yang berbeda secara menurun, lalu filter baris yang peringkatnya sama dengan N. Karena logikanya tidak berubah saat N berubah, satu pendekatan ini dapat menjawab seluruh keluarga pertanyaan tersebut.

Kita akan menyusun solusinya, menangani nilai yang sama dan duplikat, serta membahas alasan DENSE_RANK merupakan fungsi peringkat yang tepat untuk semantik "nilai berbeda".

Templat inti

Berikut adalah templat nilai tertinggi ke-N yang dapat digunakan kembali. Ganti konstantanya dengan N yang diminta pewawancara.

Anda menghitung DENSE_RANK dalam kueri dalam, karena fungsi jendela tidak dapat ditempatkan di WHERE, lalu memfilter rnk = N di luar. Untuk gaji tertinggi ke-3, atur filternya menjadi rnk = 3.

SELECT salary AS nth_highest
FROM (
  SELECT salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
  FROM employee
) ranked
WHERE rnk = 3;

Bagaimana DENSE_RANK memberi nomor pada nilai yang berbeda

DENSE_RANK memberikan peringkat yang sama kepada nilai yang setara dan tidak pernah meninggalkan celah setelahnya. Inilah definisi "nilai berbeda ke-N" yang dimaksud pewawancara.

Untuk gaji 800, 800, 600, 600, 400:

  • 800 -> peringkat 1
  • 600 -> peringkat 2
  • 400 -> peringkat 3

Jadi, nilai tertinggi ke-3 adalah 400, meskipun terdapat lima baris. Duplikat otomatis digabung menjadi satu peringkat.

Mengapa RANK memberikan jawaban yang salah

Ganti dengan RANK dan jawabannya menjadi salah. RANK meninggalkan celah yang sebanding dengan jumlah nilai yang sama.

Untuk gaji 800, 800, 600, 600, 400:

  • 800, 800 -> peringkat 1 (keduanya)
  • 600, 600 -> peringkat 3 (ada celah, tidak ada peringkat 2)
  • 400 -> peringkat 5

Memfilter rnk = 3 mengembalikan 600, sedangkan rnk = 2 tidak mengembalikan apa pun. Kecuali pewawancara secara khusus menginginkan pemeringkatan gaya kompetisi, DENSE_RANK adalah pilihan yang benar untuk "gaji berbeda ke-N".

Mengapa ROW_NUMBER juga salah di sini

ROW_NUMBER memberikan nomor unik kepada setiap baris dan sepenuhnya mengabaikan nilai yang sama. Untuk 800, 800, 600, 600, 400, hasilnya adalah 1, 2, 3, 4, 5.

Jadi, rn = 3 mengembalikan 600, tetapi rn = 2 mengembalikan duplikat 800, bukan nilai berbeda kedua. ROW_NUMBER menjawab "baris ke-N", bukan "nilai berbeda ke-N".

Gunakan ROW_NUMBER hanya ketika pertanyaannya memang menginginkan baris tertentu, seperti untuk menghapus duplikat atau memilih N teratas per kelompok sambil mempertahankan tepat satu baris.

SELECT salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn
FROM employee;

Memparameterkan N dengan aman

Dalam kode nyata, Anda tidak akan menulis peringkat secara tetap. Teruskan N sebagai parameter dan bandingkan dengan parameter tersebut. Definisi jendelanya tetap sama; hanya filter luar yang dijadikan parameter.

Di sini Anda juga dapat mengembalikan semua gaji yang sama pada peringkat N: karena DENSE_RANK menggunakan peringkat yang sama untuk nilai yang sama, WHERE rnk = N dapat mengembalikan beberapa baris jika beberapa karyawan memiliki gaji berbeda tertinggi ke-N yang sama. Sering kali, inilah perilaku yang diinginkan.

SELECT id, salary
FROM (
  SELECT id, salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
  FROM employee
) ranked
WHERE rnk = :n;

Generalisasi hitungan berkorelasi

Pendekatan sebelum fungsi jendela juga dapat digeneralisasi: suatu gaji merupakan gaji berbeda tertinggi ke-N jika tepat ada N - 1 gaji berbeda yang secara ketat lebih tinggi daripadanya.

Untuk gaji tertinggi ke-3, harus ada tepat 2 gaji berbeda yang lebih tinggi. Cara ini bekerja pada mesin basis data lama yang tidak memiliki fungsi jendela, tetapi skalanya buruk karena hitungan dalam dijalankan kembali untuk setiap baris luar.

SELECT DISTINCT salary AS nth_highest
FROM employee e
WHERE (
  SELECT COUNT(DISTINCT e2.salary)
  FROM employee e2
  WHERE e2.salary > e.salary
) = 2;

Bentuk fungsi MySQL yang diminta pewawancara

Soal "gaji tertinggi ke-N" bergaya LeetCode sering meminta fungsi tersimpan yang mengembalikan satu nilai. Isi fungsi itu hanyalah templat DENSE_RANK yang dibungkus untuk mengembalikan satu gaji.

Anda tidak perlu menghafalkan sintaks fungsi secara persis dalam wawancara, tetapi penting untuk mengetahui bahwa LIMIT N-1, 1 pada gaji yang berbeda merupakan pola khas MySQL yang ringkas.

SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 2;  -- N = 3, so OFFSET N-1

Contoh: gaji tertinggi ke-4

Gaji: 1000, 900, 900, 700, 500, 500, 300.

Gaji yang berbeda secara menurun dengan DENSE_RANK:

  • 1000 -> 1
  • 900 -> 2
  • 700 -> 3
  • 500 -> 4
  • 300 -> 5

Gaji tertinggi ke-4 adalah 500. Perhatikan bahwa kedua baris dengan nilai 500 memiliki peringkat 4 yang sama, sehingga memfilter rnk = 4 mengembalikan kedua karyawan yang menerima gaji 500 jika Anda juga memilih ID mereka.

Catatan kinerja

Bagaimana perbandingan pendekatan ini saat datanya besar?

  • DENSE_RANK: satu pengurutan pada data, lalu filter. Efisien, dan perencana kueri dapat menggunakan indeks pada gaji untuk pengurutan.
  • Hitungan berkorelasi: berpotensi O(n kuadrat) karena fungsi agregat dalam dijalankan untuk setiap baris. Hindari pada tabel besar.
  • LIMIT/OFFSET: cepat untuk N kecil, tetapi tetap harus mengurutkan; offset besar memindai dan membuang banyak baris.

Utamakan DENSE_RANK dan Anda hampir tidak mungkin salah.

Kasus batas yang perlu disebutkan

Kandidat yang kuat menyebutkan kasus batas sebelum ditanya:

  • N lebih besar daripada jumlah gaji berbeda: filter tidak cocok dengan baris mana pun dan menghasilkan hasil kosong. Pelajaran 4 membahas cara memaksa satu NULL.
  • Nilai yang sama pada peringkat N: DENSE_RANK mengembalikan setiap karyawan dengan nilai yang sama; tentukan apakah itu yang diinginkan.
  • N = 1: templat tetap berfungsi dan mengembalikan nilai maksimum.

Pemeriksaan Cepat

Terapkan templat nilai tertinggi ke-N.

Ringkasan

Untuk gaji tertinggi ke-N, ada satu jawaban andalan: beri peringkat pada gaji yang berbeda dengan DENSE_RANK() OVER (ORDER BY salary DESC) dalam subkueri, lalu filter menggunakan WHERE rnk = N.

  • DENSE_RANK berarti "nilai berbeda ke-N", dengan nilai yang sama berbagi peringkat dan tanpa celah.
  • RANK menghasilkan celah; ROW_NUMBER menghitung baris, bukan nilai.
  • Trik hitungan berkorelasi = N-1 menggeneralisasi gagasan yang sama tanpa fungsi jendela, tetapi skalanya buruk.

Selalu sebutkan kasus batas ketika "N melebihi nilai yang tersedia"; kita akan menyelesaikannya berikutnya.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Nilai Tertinggi ke-N dengan DENSE_RANK” gratis?

Ya — teks lengkap “Nilai Tertinggi ke-N dengan DENSE_RANK” 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 “Nilai Tertinggi ke-N dengan DENSE_RANK”?

Generalisasikan ke nilai unik ke-N dan tangani duplikat. 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 “Nilai Tertinggi ke-N dengan DENSE_RANK” 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. Gaji Tertinggi Kedua, Lima Cara
  2. Nilai Tertinggi ke-N dengan DENSE_RANK
  3. Penerima Penghasilan Tertinggi Per Departemen
  4. Mengembalikan NULL Saat Nilai ke-N Tidak Ada
← Kembali ke SQL Interview Prep