Persediaan Temu Duga Pengaturcaraan · Pelajaran

RANK berbanding DENSE_RANK apabila Seri

Soalan klasik tentang kedudukan dengan jurang berbanding tanpa jurang apabila nilai seri

Pelajaran 3 daripada 413 langkah

RANK berbanding DENSE_RANK apabila Seri ialah pelajaran Persediaan Temu Duga Pengaturcaraan 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 Pengaturcaraan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Tiga Fungsi Pemeringkatan Bersebelahan

SQL menyediakan tiga fungsi tetingkap pemeringkatan, dan soalan tetingkap yang paling kerap ditanya ialah cara fungsi tersebut berbeza apabila berlaku seri:

  • ROW_NUMBER — sentiasa unik; baris seri mendapat nombor berbeza yang ditentukan secara tidak tentu.
  • RANK — baris seri berkongsi kedudukan, kemudian kedudukan seterusnya melangkau (meninggalkan jurang).
  • DENSE_RANK — baris seri berkongsi kedudukan, kemudian kedudukan seterusnya tidak melangkau (tiada jurang).

Mampu menyebut perbezaan ini serta-merta merupakan petunjuk yang baik dalam temu duga.

Jadual Contoh Konkret

Bayangkan lima skor yang disusun secara menurun: 100, 90, 90, 80, 70. Perhatikan cara setiap fungsi menomborkannya.

  • ROW_NUMBER: 1, 2, 3, 4, 5
  • RANK: 1, 2, 2, 4, 5 (melangkau 3 selepas seri)
  • DENSE_RANK: 1, 2, 2, 3, 4 (tiada lompatan)

Hafalkan contoh 100/90/90/80/70 ini — ia memberikan jawapan serta-merta kepada soalan tersebut.

SELECT
  score,
  ROW_NUMBER()  OVER (ORDER BY score DESC) AS rownum,
  RANK()        OVER (ORDER BY score DESC) AS rnk,
  DENSE_RANK()  OVER (ORDER BY score DESC) AS dense
FROM scores;

Cara RANK Mengira Jurang

RANK menetapkan kedudukan setiap baris sebagai satu ditambah bilangan baris yang mendahuluinya secara ketat dalam susunan. Dua baris yang seri pada nilai 90 masing-masing didahului oleh satu baris (100), jadi kedua-duanya mendapat kedudukan 2. Nilai seterusnya yang lebih rendah didahului oleh tiga baris, jadi kedudukannya melonjak kepada 4.

Itulah sebabnya RANK mencerminkan pemarkahan pertandingan: pemenang pingat perak yang seri, tanpa pingat gangsa.

-- scores 100,90,90,80 -> RANK = 1,2,2,4
SELECT score, RANK() OVER (ORDER BY score DESC) AS rnk
FROM scores;

Cara DENSE_RANK Mengelakkan Jurang

DENSE_RANK menetapkan kedudukan sebagai satu ditambah bilangan nilai berbeza yang mendahului nilai semasa. Selepas seri pada 90, hanya dua nilai berbeza yang mendahului 80 (100 dan 90), jadi 80 mendapat kedudukan 3 — tiada jurang.

Gunakan DENSE_RANK apabila anda mengambil berat tentang kedudukan nilai berbeza, seperti “gaji kedua tertinggi” apabila seri perlu dikira sekali sahaja.

-- scores 100,90,90,80 -> DENSE_RANK = 1,2,2,3
SELECT score, DENSE_RANK() OVER (ORDER BY score DESC) AS dense
FROM scores;

Bila Memilih Setiap Fungsi

Panduan keputusan ringkas yang gemar didengar oleh penemuduga:

  • Perlu tepat satu baris bagi setiap kedudukan (rekod terkini, penomboran halaman)? → ROW_NUMBER.
  • Perlu kedudukan yang mengendalikan nilai sama dan lompang dengan betul (kedudukan sukan, 3 teratas termasuk nilai yang sama)? → RANK.
  • Perlu nilai berbeza ke-N (gaji ke-N tertinggi)? → DENSE_RANK.

Pilihan yang salah mengubah baris yang dikembalikan, jadi jelaskan sebab pilihan itu dengan lantang.

Menentukan Kedudukan Dalam Bahagian

Ketiga-tiga fungsi menerima PARTITION BY untuk menentukan kedudukan secara berasingan dalam setiap kumpulan. Setiap bahagian bermula semula pada kedudukan 1.

Di sini, setiap jabatan menentukan kedudukan pekerjanya sendiri berdasarkan gaji, dengan nilai yang sama dikendalikan oleh DENSE_RANK. Pekerja bergaji tertinggi dalam setiap jabatan mendapat kedudukan 1, dan pekerja yang menerima gaji sama berkongsi kedudukan.

SELECT
  department,
  name,
  salary,
  DENSE_RANK() OVER (
    PARTITION BY department
    ORDER BY salary DESC
  ) AS salary_rank
FROM employees;

Contoh Berpandu: 3 Teratas Termasuk Nilai yang Sama

"Kembalikan 3 gaji tertinggi bagi setiap jabatan, dan jika beberapa orang berkongsi kedudukan ketiga, sertakan mereka semua." Ini memerlukan RANK atau DENSE_RANK, bukannya ROW_NUMBER.

Menggunakan DENSE_RANK <= 3 mengekalkan tiga tahap gaji berbeza tertinggi serta setiap pekerja pada tahap tersebut — tepat seperti maksud "termasuk nilai yang sama".

SELECT department, name, salary, salary_rank
FROM (
  SELECT department, name, salary,
         DENSE_RANK() OVER (
           PARTITION BY department ORDER BY salary DESC
         ) AS salary_rank
  FROM employees
) t
WHERE salary_rank <= 3;

Contoh Berpandu: Gaji Kedua Tertinggi

Soalan temu duga SQL yang paling terkenal. Jawapan yang kukuh menggunakan DENSE_RANK supaya gaji tertinggi yang sama tidak menyebabkan nilai kedua yang sebenar terlepas.

Jika tiga orang memperoleh gaji maksimum, DENSE_RANK = 2 masih mengenal pasti gaji berbeza seterusnya dengan betul, manakala ROW_NUMBER = 2 hanya mengembalikan seorang lagi penerima gaji tertinggi.

SELECT DISTINCT salary AS second_highest
FROM (
  SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS dr
  FROM employees
) t
WHERE dr = 2;

RANK berbanding DENSE_RANK untuk "Nilai Ke-N Tertinggi"

Mengapa menggunakan DENSE_RANK berbanding RANK untuk teka-teki nilai ke-N tertinggi? Kerana RANK meninggalkan lompang. Dengan gaji 100, 100, 90, nilai 90 mempunyai RANK = 3 tetapi DENSE_RANK = 2.

Jika soalan meminta "gaji berbeza ke-2 tertinggi," menapis RANK = 2 tidak akan mengembalikan apa-apa, manakala DENSE_RANK = 2 mengembalikan 90 dengan betul. Sentiasa padankan "nilai berbeza ke-N" dengan DENSE_RANK.

-- salaries 100,100,90
-- RANK:       1,1,3   -> WHERE rank = 2 returns NOTHING
-- DENSE_RANK: 1,1,2   -> WHERE dense_rank = 2 returns 90

Nota Merentas Dialek

Berita baik: ROW_NUMBER, RANK dan DENSE_RANK mengikut piawaian SQL dan berkelakuan sama dalam PostgreSQL, SQL Server, Oracle, MySQL 8+, BigQuery dan Snowflake. Peraturan pengendalian nilai yang sama di atas adalah sejagat.

Satu fungsi berkaitan, PERCENT_RANK, dibina berdasarkan RANK untuk memberikan kedudukan relatif dari 0 hingga 1 — wajar disebut jika penemuduga bertanya tentang kedudukan persentil.

Kesilapan Lazim

Beri perhatian kepada perkara berikut:

  • Menggunakan ROW_NUMBER untuk "nilai ke-N tertinggi" lalu terlepas baris yang mempunyai kedudukan sama.
  • Menggunakan RANK apabila soalan merujuk kepada nilai berbeza, kemudian mendapat hasil kosong disebabkan lompang.
  • Melupakan ORDER BY di dalam OVER — penentuan kedudukan tidak bermakna tanpanya.
  • Menapis penentuan kedudukan secara langsung dalam WHERE, bukannya dalam pertanyaan luar.

Semakan Ringkas

Gunakan peraturan nilai yang sama.

Imbas Kembali: Dengan Lompang dan Tanpa Lompang

Anda kini boleh memilih fungsi penentuan kedudukan yang betul dengan serta-merta:

  • ROW_NUMBER: nombor unik, tiada kedudukan yang dikongsi.
  • RANK: nilai yang sama berkongsi kedudukan, kemudian terdapat lompang (1,2,2,4).
  • DENSE_RANK: nilai yang sama berkongsi kedudukan, tanpa lompang (1,2,2,3).
  • "Nilai berbeza ke-N tertinggi" → DENSE_RANK; "N teratas termasuk nilai yang sama" → RANK/DENSE_RANK; "satu baris bagi setiap kedudukan" → ROW_NUMBER.

Seterusnya: cara sebenar menapis hasil tetingkap, kerana anda tidak boleh melakukannya dalam WHERE.

Percuma untuk bermula

Pelajari Persediaan Temu Duga Pengaturcaraan 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
90
Pelajaran
360

Soalan Lazim

Adakah pelajaran “RANK berbanding DENSE_RANK apabila Seri” percuma?

Ya — teks penuh “RANK berbanding DENSE_RANK apabila Seri” 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 Pengaturcaraan, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “RANK berbanding DENSE_RANK apabila Seri”?

Soalan klasik tentang kedudukan dengan jurang berbanding tanpa jurang apabila nilai seri Anda berlatih Persediaan Temu Duga Pengaturcaraan 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 Pengaturcaraan?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga Pengaturcaraan 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 “RANK berbanding DENSE_RANK apabila Seri” 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 Pengaturcaraan ini?

Ya. Setiap pelajaran Persediaan Temu Duga Pengaturcaraan 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. OVER, PARTITION BY dan ORDER BY
  2. ROW_NUMBER untuk Penjujukan Unik
  3. RANK berbanding DENSE_RANK apabila Seri
  4. Menapis Keputusan Tetingkap
← Kembali ke Persediaan Temu Duga Pengaturcaraan