Persediaan Temu Duga SQL · Pelajaran

Mengendalikan Nilai Seri dalam Teratas-N

Bila perlu menggunakan RANK atau DENSE_RANK supaya semua baris seri disertakan

Pelajaran 2 daripada 413 langkah

Mengendalikan Nilai Seri dalam Teratas-N ialah pelajaran Persediaan Temu Duga SQL percuma di CoddyKit. Ini ialah pelajaran 2 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.

Soalan Susulan tentang Seri

Selepas anda menguasai pemilihan N teratas dengan ROW_NUMBER, penemu duga mengemukakan soalan yang lebih mencabar: "Bagaimana jika dua pekerja mempunyai gaji yang sama tepat pada had pemilihan? Patutkah kedua-duanya disertakan?"

Soalan ini membezakan calon yang menghafal satu pertanyaan daripada calon yang memahami semantik kedudukan. Jawapannya bergantung pada pilihan antara ROW_NUMBER, RANK dan DENSE_RANK. Pelajaran ini memadankan setiap fungsi dengan tujuan perniagaan.

ROW_NUMBER Menyembunyikan Seri

ROW_NUMBER memberikan nombor bulat yang benar-benar unik kepada setiap baris. Walaupun dua baris mempunyai nilai yang sama pada lajur susunan, satu baris mendapat 2 dan satu lagi mendapat 3 mengikut susunan sewenang-wenangnya.

Kesannya: penapis WHERE rn <= 3 mengembalikan tepat 3 baris dan mungkin menggugurkan secara senyap baris seri yang sewajarnya disertakan. Hal ini sesuai apabila anda benar-benar mahukan bilangan tetap, tetapi salah apabila semua baris seri sepatutnya layak.

-- 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 Meninggalkan Jurang

RANK memberikan kedudukan yang sama kepada baris seri, kemudian melangkau nilai seterusnya untuk mengambil kira seri tersebut. Dua baris yang seri pada kedudukan 2 kedua-duanya mendapat 2, dan baris berikutnya melompat ke kedudukan 4, bukannya 3.

Gunakan RANK apabila anda mahukan "3 kedudukan teratas" dan satu kedudukan boleh dikongsi oleh beberapa orang, seperti kedudukan pertandingan sebenar apabila dua pemenang pingat perak bermakna tiada pemenang pingat gangsa.

-- Salaries: 100, 90, 90, 80
-- RANK -> 1, 2, 2, 4   (rank 3 is skipped)
RANK() OVER (ORDER BY salary DESC)

DENSE_RANK Tiada Jurang

DENSE_RANK juga memberikan kedudukan yang sama kepada baris seri tetapi tidak melangkau kedudukan selepasnya. Dua baris yang seri pada kedudukan 2 kedua-duanya mendapat 2, dan nilai berbeza seterusnya ialah 3.

Gunakan DENSE_RANK apabila soalan berkaitan dengan nilai berbeza: "3 tahap gaji berbeza tertinggi" atau "3 kategori harga teratas". Fungsi ini mengira 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 Sebelah Menyebelah

Bagi senarai gaji 100, 90, 90, 80, ketiga-tiga fungsi menghasilkan:

  • ROW_NUMBER: 1, 2, 3, 4
  • RANK: 1, 2, 2, 4
  • DENSE_RANK: 1, 2, 2, 3

Jadual ini wajar dihafal sepenuhnya. Penemu duga mungkin hanya meminta anda melengkapkannya untuk senarai tertentu, dan memahami tingkah laku jurang dengan betul ialah perkara utama.

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 Seri Dengan RANK

Untuk menjawab "3 teratas, tetapi sertakan semua yang seri pada sempadan", tapis menggunakan RANK() <= 3. Jika dua orang berkongsi kedudukan 3, kedua-duanya muncul, jadi hasilnya mungkin mengandungi lebih daripada 3 baris.

Inilah maksud soalan yang menggunakan frasa "3 kedudukan teratas", bukannya "sebarang 3 baris". Nyatakan dengan jelas bahawa bilangan baris boleh melebihi N apabila berlaku seri.

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 Tahap Berbeza Teratas Dengan DENSE_RANK

Apabila keperluannya ialah "3 tahap gaji berbeza teratas" dan anda mahu setiap pekerja pada ketiga-tiga tahap tersebut, gunakan DENSE_RANK() <= 3.

Hasilnya boleh mengandungi banyak baris: semua pekerja dalam tiga gred gaji teratas, tanpa mengira jumlah pekerja dalam gred tersebut. Inti pentingnya ialah DENSE_RANK mengira nilai berbeza, jadi penapis memilih lapisan nilai dan bukannya bilangan 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 Membuat Keputusan

Padankan perkataan yang digunakan dengan fungsi:

  • "Tepat N baris" atau penomboran halaman → ROW_NUMBER (tambahkan pemecah seri).
  • "N kedudukan teratas, seri berkongsi kedudukan" → RANK.
  • "N nilai / tahap / kategori berbeza teratas" → DENSE_RANK.

Apabila spesifikasi tidak jelas, tanya: "Jika berlaku seri pada had pemilihan, patutkah saya menyertakan semua baris seri atau mengehadkan hasil kepada N?" Soalan penjelasan itu sendiri boleh memberikan markah.

Pemecah Seri Masih Penting

Walaupun menggunakan RANK atau DENSE_RANK, penambahan kunci ORDER BY kedua mengawal susunan paparan baris seri dan memastikan hasilnya stabil. Kunci itu tidak mengubah baris yang layak, tetapi menjadikan hasil boleh dihasilkan semula.

Dengan ROW_NUMBER, pemecah seri amat penting kerana pemecah seri menentukan baris seri yang akan melepasi had rn atau tidak.

RANK() OVER (
  PARTITION BY department
  ORDER BY salary DESC, name ASC
) AS rnk

Contoh Praktikal: Penjaring Teratas

Jadual game_scores mempunyai player dan score. Penemu duga mahukan "semua pemain dalam 2 kedudukan skor teratas". Seri pada tempat pertama bermaksud dua pemain berada pada kedudukan 1, kemudian skor berbeza seterusnya berada pada kedudukan 2.

"Kedudukan" tanpa melangkau selepas seri menunjukkan penggunaan DENSE_RANK. Jika mereka sebaliknya berkata "2 kedudukan teratas dengan lompatan", anda akan menukar kepada RANK. Beri perhatian kepada frasa yang 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;

Kesilapan Lazim yang Perlu Dielakkan

Perangkap yang diperhatikan penemu duga:

  • Menggunakan ROW_NUMBER apabila soalan mahu semua baris seri disertakan, lalu menggugurkan baris yang layak secara senyap.
  • Keliru tentang tingkah laku jurang bagi RANK dan DENSE_RANK.
  • Terlepas pandang bahawa penapis RANK/DENSE_RANK boleh mengembalikan lebih daripada N baris, kemudian mendakwa hasil itu salah.
  • Meninggalkan PARTITION BY apabila N teratas adalah bagi setiap kumpulan, lalu menyusun kedudukan keseluruhan jadual.

Semakan Pantas

Pilih fungsi pemeringkatan yang betul berdasarkan tingkah laku seri yang diterangkan.

Ringkasan: Mengendalikan Nilai Seri

Tiga fungsi, tiga tingkah laku apabila seri:

  • ROW_NUMBER: sentiasa unik, tepat N baris, dan nilai seri dipecahkan secara sewenang-wenangnya.
  • RANK: nilai seri berkongsi kedudukan, kemudian terdapat jurang.
  • DENSE_RANK: nilai seri berkongsi kedudukan, tiada jurang, dan mengira nilai berbeza.

Pilih berdasarkan kata-kata soalan, ajukan soalan penjelasan apabila maksudnya samar, dan ingat bahawa penapis RANK/DENSE_RANK mungkin mengembalikan lebih daripada N baris mengikut reka bentuknya.

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 “Mengendalikan Nilai Seri dalam Teratas-N” percuma?

Ya — teks penuh “Mengendalikan Nilai Seri dalam Teratas-N” 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 “Mengendalikan Nilai Seri dalam Teratas-N”?

Bila perlu menggunakan RANK atau DENSE_RANK supaya semua baris seri disertakan 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 2 daripada 4.

Berapa lamakah pelajaran “Mengendalikan Nilai Seri dalam Teratas-N” 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. Baris Teratas-N Setiap Kumpulan Dengan ROW_NUMBER
  2. Mengendalikan Nilai Seri dalam Teratas-N
  3. Membuang Pendua Baris dengan Selamat
  4. Mengekalkan Baris Terbaharu bagi Setiap Kunci
← Kembali ke Persediaan Temu Duga SQL