0Pricing
SQL Interview Prep · Pelajaran

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 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.

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 TIES atau RANK.
  • 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 ... LIMIT saja bersifat tidak deterministik ketika kunci pengurutan memiliki nilai yang sama.
  • Tambahkan pemecah seri unik untuk hasil tepat-N yang stabil.
  • Gunakan WITH TIES atau RANK untuk mempertahankan nilai seri pada batas.
  • Gunakan DENSE_RANK untuk 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 SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL 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 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 “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 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. Pengurutan Multi-Kolom dan Penempatan NULL
  2. LIMIT, OFFSET, dan FETCH FIRST
  3. Mengembalikan Baris Top-N secara Andal
  4. Mengurutkan Berdasarkan Ekspresi dan Alias
← Kembali ke SQL Interview Prep