Mengembalikan Baris Top-N secara Andal
Mengapa ORDER BY ditambah LIMIT dapat menghasilkan urutan yang tidak deterministik tanpa pemecah seri.
Mengembalikan Baris Top-N secara Andal adalah pelajaran Coding 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 Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.
Jebakan Tersembunyi dalam Kueri N Teratas
"Berikan saya 5 karyawan dengan gaji tertinggi" terdengar mudah: ORDER BY salary DESC LIMIT 5. Namun, pewawancara sengaja menyisipkan jebakan. Bagaimana jika enam orang memiliki gaji yang sama pada batas tersebut? Bagaimana jika banyak baris memiliki nilai yang sama?
Masalah utamanya adalah sifat deterministik: ketika kunci pengurutan memiliki nilai yang sama, LIMIT memotong secara sembarang, dan baris yang dikembalikan dapat berubah dari satu eksekusi ke eksekusi berikutnya. Pelajaran ini membuat kueri N teratas dapat diandalkan.
Mengapa ORDER BY + LIMIT Dapat Bersifat Tidak Deterministik
Pertimbangkan gaji dengan peringkat 4, 5, dan 6 yang semuanya 50000. ORDER BY salary DESC LIMIT 5 harus mengembalikan tepat 5 baris, sehingga kueri tersebut memilih dua dari tiga baris yang nilainya sama dan membuang satu, tetapi dua baris yang dipilih tidak ditentukan.
Jalankan kueri dua kali, atau jalankan lagi setelah pengoptimal mengubah rencana eksekusi, dan Anda mungkin mendapatkan orang yang berbeda. Ketidakdeterministikan itulah yang ingin Anda temukan dalam wawancara.
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;Perbaikan 1: Tambahkan Pemecah Seri Unik
Perbaikan paling sederhana adalah menjadikan urutan pengurutan bersifat total dengan menambahkan kolom yang unik, biasanya kunci utama. Kini tidak ada dua baris yang sama pada kunci lengkap, sehingga pemotongan menjadi deterministik dan dapat direproduksi.
Ini tidak mengubah gaji yang muncul, tetapi membuat pilihan di antara baris dengan nilai yang sama tetap konsisten pada setiap eksekusi.
SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC
LIMIT 5;Perbaikan 2: Sertakan Semua Nilai Seri dengan WITH TIES
Terkadang persyaratannya adalah "sertakan semua orang yang nilainya sama dengan batas," bukan tepat N baris. SQL standar dan SQL Server menyediakan WITH TIES, yang mengembalikan baris tambahan yang memiliki nilai ORDER BY yang sama dengan baris terakhir.
Jika gaji ke-5 dimiliki oleh tiga orang, kueri ini mengembalikan 7 baris. Perhatikan bahwa WITH TIES memerlukan ORDER BY.
SELECT name, salary
FROM employees
ORDER BY salary DESC
FETCH FIRST 5 ROWS WITH TIES;Perjelas Persyaratannya Terlebih Dahulu
Sebelum menulis kode, tanyakan kepada pewawancara: "Jika terdapat nilai yang sama pada batas, apakah Anda menginginkan tepat N baris atau semua baris yang nilainya sama?" Satu pertanyaan klarifikasi ini menunjukkan tingkat senioritas.
- Tepat N, stabil: tambahkan pemecah seri yang unik.
- Semua nilai seri disertakan: gunakan
WITH TIESatauRANK. - Nilai berbeda: gunakan
DENSE_RANK.
Pendekatan Fungsi Jendela yang Portabel
Banyak mesin tidak menyediakan WITH TIES. Pola yang portabel dan kuat menggunakan fungsi jendela pemeringkatan dalam subkueri atau CTE, lalu menyaring berdasarkan peringkat tersebut. ROW_NUMBER memberikan tepat N baris dengan kunci pengurutan yang deterministik.
Anda harus membungkus fungsi jendela tersebut karena Anda tidak dapat merujuknya secara langsung dalam WHERE.
SELECT name, salary
FROM (
SELECT name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC, id ASC) AS rn
FROM employees
) ranked
WHERE rn <= 5;Gunakan RANK untuk Mempertahankan Nilai Seri
Ganti ROW_NUMBER dengan RANK jika Anda ingin mempertahankan semua baris yang nilainya sama dan membiarkan celah dalam penomoran. Jika tiga baris memiliki peringkat 4 yang sama, semuanya mendapat peringkat 4 dan peringkat berikutnya adalah 7.
Menyaring dengan rank <= 5 kemudian mengembalikan setiap baris dalam lima posisi gaji teratas, termasuk baris yang nilainya sama.
SELECT name, salary
FROM (
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employees
) ranked
WHERE rnk <= 5;DENSE_RANK untuk N Nilai Berbeda Teratas
"3 tingkat gaji teratas" (bukan 3 orang teratas) berarti nilai yang berbeda. DENSE_RANK memberikan peringkat yang sama untuk nilai seri dan tidak melewati angka, sehingga dense_rnk <= 3 mengembalikan semua orang yang memperoleh salah satu dari tiga gaji tertinggi yang berbeda.
Mengetahui fungsi pemeringkatan mana yang sesuai dengan setiap rumusan merupakan pembeda klasik.
SELECT name, salary
FROM (
SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employees
) ranked
WHERE drnk <= 3;Kasus Khusus Nilai Teratas Tunggal
Untuk satu baris teratas, ORDER BY ... LIMIT 1 berfungsi, tetapi tetap berisiko mengabaikan nilai seri. Jika Anda ingin setiap baris yang memiliki nilai maksimum, bandingkan dengan maksimum dari subkueri atau gunakan RANK() = 1.
Bentuk subkueri maksimum ini rapi dan dapat dijalankan dalam dialek apa pun.
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);Membandingkan Pendekatan
Ringkasan kapan setiap alat digunakan untuk N teratas yang andal:
LIMIT+ pemecah seri unik: tepat N baris, stabil, dan paling sederhana.FETCH ... WITH TIES: tepat N baris ditambah nilai seri pada batas, sesuai SQL standar.ROW_NUMBER: tepat N baris, deterministik, dan sepenuhnya portabel.RANK: N posisi teratas dengan semua nilai seri.DENSE_RANK: N nilai berbeda teratas.
Pratinjau N Teratas per Grup
Pendekatan fungsi jendela dapat digeneralisasi dengan sangat baik. Tambahkan PARTITION BY untuk mendapatkan N teratas dalam setiap grup, misalnya 2 penerima gaji tertinggi di setiap departemen. Penyaringan rn <= n yang sama diterapkan setelah pemartisian.
N teratas per grup ini merupakan salah satu masalah wawancara nyata yang paling sering muncul, dengan pola yang persis seperti yang baru saja Anda pelajari.
SELECT department, name, salary
FROM (
SELECT department, name, salary,
ROW_NUMBER() OVER (PARTITION BY department
ORDER BY salary DESC, id ASC) AS rn
FROM employees
) ranked
WHERE rn <= 2;Pemeriksaan Cepat
Cocokkan persyaratan dengan fungsi yang tepat.
Rangkuman
Untuk mengembalikan N teratas secara andal:
ORDER BY ... LIMITsaja bersifat tidak deterministik ketika kunci pengurutan memiliki nilai yang sama.- Tambahkan pemecah seri unik untuk hasil tepat-N yang stabil.
- Gunakan
WITH TIESatauRANKuntuk mempertahankan nilai seri pada batas. - Gunakan
DENSE_RANKuntuk nilai berbeda N teratas. - Selalu pastikan apakah pewawancara menginginkan tepat N baris atau semua baris yang nilainya sama.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengembalikan Baris Top-N secara Andal” gratis?
Ya — teks lengkap “Mengembalikan Baris Top-N secara Andal” 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 “Mengembalikan Baris Top-N secara Andal”?
Mengapa ORDER BY ditambah LIMIT dapat menghasilkan urutan yang tidak deterministik tanpa pemecah seri. 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 3 dari 4.
Berapa lama pelajaran “Mengembalikan Baris Top-N secara Andal” 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
- Pengurutan Multi-Kolom dan Penempatan NULL
- LIMIT, OFFSET, dan FETCH FIRST
- Mengembalikan Baris Top-N secara Andal
- Mengurutkan Berdasarkan Ekspresi dan Alias