Persediaan Temu Duga SQL · Pelajaran

Mengembalikan Baris Teratas-N Dengan Boleh Dipercayai

Mengapa ORDER BY bersama LIMIT boleh menjadi tidak tentu tanpa pemecah seri

Pelajaran 3 daripada 413 langkah

Mengembalikan Baris Teratas-N Dengan Boleh Dipercayai ialah pelajaran Persediaan Temu Duga SQL percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga SQL, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Pepijat Tersembunyi dalam Pertanyaan N Teratas

"Berikan saya 5 pekerja bergaji tertinggi" kedengaran mudah: ORDER BY salary DESC LIMIT 5. Namun, penemuduga sengaja meletakkan perangkap. Bagaimana jika enam orang menerima gaji yang sama pada sempadan? Bagaimana jika banyak baris seri?

Isu terasnya ialah sifat deterministik: apabila kunci isihan mempunyai nilai seri, LIMIT memotongnya secara sewenang-wenangnya dan baris tepat yang dikembalikan boleh berubah antara pelaksanaan. Pelajaran ini menjadikan pertanyaan N Teratas boleh dipercayai.

Mengapa ORDER BY + LIMIT Boleh Menjadi Tidak Deterministik

Pertimbangkan gaji bagi kedudukan 4, 5 dan 6 yang semuanya 50000. ORDER BY salary DESC LIMIT 5 mesti mengembalikan tepat 5 baris, jadi ia mengekalkan dua daripada tiga baris yang seri dan menggugurkan satu, tetapi dua yang mana tidak ditakrifkan.

Jalankan pertanyaan itu dua kali, atau jalankannya selepas pengoptimum mengubah pelan, dan Anda mungkin mendapat orang yang berbeza. Sifat tidak deterministik itu ialah pepijat yang mahu dikesan oleh penemuduga.

SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;

Pembetulan 1: Tambah Pemutus Seri Unik

Pembetulan paling mudah ialah menjadikan susunan isihan menyeluruh dengan menambahkan lajur yang unik, biasanya kunci primer. Kini tiada dua baris yang mempunyai nilai sama pada keseluruhan kunci, jadi pemotongan itu deterministik dan boleh dihasilkan semula.

Ini tidak mengubah gaji yang muncul, tetapi menjadikan pilihan antara baris yang seri konsisten antara pelaksanaan.

SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC
LIMIT 5;

Pembetulan 2: Sertakan Semua Seri dengan WITH TIES

Kadang-kadang keperluannya ialah "sertakan semua orang yang seri dengan sempadan", bukannya tepat N baris. SQL piawai dan SQL Server menawarkan WITH TIES, yang mengembalikan baris tambahan yang sepadan dengan nilai ORDER BY baris terakhir.

Jika gaji ke-5 dikongsi oleh tiga orang, ini mengembalikan 7 baris. Perhatikan bahawa WITH TIES memerlukan ORDER BY.

SELECT name, salary
FROM employees
ORDER BY salary DESC
FETCH FIRST 5 ROWS WITH TIES;

Jelaskan Keperluan Dahulu

Sebelum menulis kod, tanyakan kepada penemuduga: "Jika terdapat seri pada sempadan, adakah Anda mahu tepat N baris atau semua baris yang seri?" Soalan penjelasan tunggal ini menunjukkan pengalaman.

  • Tepat N, stabil: tambahkan pemutus seri unik.
  • Semua seri disertakan: gunakan WITH TIES atau RANK.
  • Nilai berbeza: gunakan DENSE_RANK.

Pendekatan Fungsi Tetingkap Mudah Alih

Banyak enjin tidak mempunyai WITH TIES. Corak fungsi tetingkap pemeringkatan yang mudah alih dan berkuasa menggunakan fungsi tersebut dalam subpertanyaan atau CTE, kemudian menapis berdasarkan kedudukan. ROW_NUMBER memberikan tepat N baris dengan kunci susunan yang deterministik.

Anda mesti membungkus fungsi tetingkap itu kerana Anda tidak boleh merujuknya secara terus 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 Mengekalkan Seri

Gantikan ROW_NUMBER dengan RANK apabila Anda mahu semua baris yang seri dikekalkan dan terdapat jurang dalam penomboran. Jika tiga baris seri pada kedudukan 4, kesemuanya mendapat kedudukan 4 dan kedudukan seterusnya ialah 7.

Menapis menggunakan rank <= 5 kemudian mengembalikan setiap baris dalam lima kedudukan gaji teratas, termasuk baris yang seri.

SELECT name, salary
FROM (
  SELECT name, salary,
         RANK() OVER (ORDER BY salary DESC) AS rnk
  FROM employees
) ranked
WHERE rnk <= 5;

DENSE_RANK untuk Nilai N Teratas yang Berbeza

"tahap gaji 3 teratas" (bukan 3 orang teratas) bermaksud nilai yang berbeza. DENSE_RANK memberikan kedudukan yang sama kepada nilai seri dan tidak melangkau nombor, jadi dense_rnk <= 3 mengembalikan semua orang yang memperoleh salah satu daripada tiga gaji berbeza tertinggi.

Mengetahui fungsi pemeringkatan yang menjawab setiap bentuk soalan ialah pembeza klasik.

SELECT name, salary
FROM (
  SELECT name, salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
  FROM employees
) ranked
WHERE drnk <= 3;

Kes Khas Baris Teratas

Untuk satu baris teratas, ORDER BY ... LIMIT 1 berfungsi tetapi masih berisiko menghadapi seri. Jika Anda mahu setiap baris yang memegang nilai maksimum, bandingkan dengan maksimum dalam subpertanyaan atau gunakan RANK() = 1.

Bentuk subpertanyaan maksimum itu kemas dan berjalan dalam apa-apa dialek.

SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

Membandingkan Pendekatan

Ringkasan masa untuk menggunakan setiap alat bagi N Teratas yang boleh dipercayai:

  • LIMIT + pemutus seri unik: tepat N baris, stabil dan paling mudah.
  • FETCH ... WITH TIES: tepat N baris serta seri pada sempadan, SQL piawai.
  • ROW_NUMBER: tepat N baris, deterministik dan sepenuhnya mudah alih.
  • RANK: N kedudukan teratas termasuk semua seri.
  • DENSE_RANK: N nilai berbeza teratas.

Pratonton N Teratas bagi Setiap Kumpulan

Pendekatan tetingkap ini boleh digunakan secara umum dengan sangat baik. Tambahkan PARTITION BY untuk mendapatkan N teratas dalam setiap kumpulan, contohnya 2 penerima gaji teratas bagi setiap jabatan. Penapis rn <= n yang sama digunakan selepas pembahagian.

N Teratas bagi setiap kumpulan ini ialah salah satu masalah temu duga sebenar yang paling kerap ditanya, dan dibina berdasarkan corak yang baru 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;

Semakan Pantas

Padankan keperluan dengan fungsi yang betul.

Imbas Kembali

Untuk mengembalikan N Teratas dengan boleh dipercayai:

  • ORDER BY ... LIMIT sahaja adalah tidak deterministik apabila kunci isihan mempunyai nilai seri.
  • Tambahkan pemutus seri unik untuk hasil tepat N yang stabil.
  • Gunakan WITH TIES atau RANK untuk mengekalkan seri pada sempadan.
  • Gunakan DENSE_RANK untuk nilai N teratas yang berbeza.
  • Sentiasa jelaskan sama ada penemuduga mahukan tepat N baris atau semua baris yang seri.
Percuma untuk bermula

Pelajari SQL dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
30
Pelajaran
120

Soalan Lazim

Adakah pelajaran “Mengembalikan Baris Teratas-N Dengan Boleh Dipercayai” percuma?

Ya — teks penuh “Mengembalikan Baris Teratas-N Dengan Boleh Dipercayai” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga SQL, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mengembalikan Baris Teratas-N Dengan Boleh Dipercayai”?

Mengapa ORDER BY bersama LIMIT boleh menjadi tidak tentu tanpa pemecah seri Anda berlatih Persediaan Temu Duga SQL menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga SQL?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga SQL di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Mengembalikan Baris Teratas-N Dengan Boleh Dipercayai” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga SQL ini?

Ya. Setiap pelajaran Persediaan Temu Duga SQL menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Pengisihan Pelbagai Lajur dan Peletakan NULL
  2. LIMIT, OFFSET dan FETCH FIRST
  3. Mengembalikan Baris Teratas-N Dengan Boleh Dipercayai
  4. Mengisih Mengikut Ungkapan dan Alias
← Kembali ke Persediaan Temu Duga SQL