Persediaan Temu Duga SQL · Pelajaran

ROW_NUMBER untuk Penjujukan Unik

Berikan nombor baris yang tentu dalam setiap partition

Pelajaran 2 daripada 413 langkah

ROW_NUMBER untuk Penjujukan Unik 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.

Jaminan ROW_NUMBER

ROW_NUMBER() menetapkan integer unik tanpa jurang kepada setiap baris dalam partisinya, bermula pada 1 dan mengikut ORDER BY tetingkap. Tiada dua baris berkongsi nombor, walaupun nilai susunannya sama.

Keunikan ini menjadi sebab penemu duga menggunakannya untuk menyelesaikan masalah “pilih satu baris bagi setiap kumpulan” dan pembuangan pendua. Fungsi pemeringkatan yang lain (RANK, DENSE_RANK) tidak menjamin keunikan apabila berlaku seri.

Pertanyaan ROW_NUMBER Minimum

Bentuk paling ringkas menomborkan keseluruhan himpunan hasil mengikut susunan yang dipilih. ROW_NUMBER sentiasa memerlukan ORDER BY di dalam OVER — tanpanya, penomboran akan menjadi tidak tentu dan kebanyakan enjin pangkalan data akan menolaknya atau memaparkan amaran.

Dalam contoh ini, pekerja yang paling baru diambil bekerja menjadi baris 1 jika anda menyusun mengikut tarikh pengambilan secara menurun.

SELECT
  name,
  hire_date,
  ROW_NUMBER() OVER (ORDER BY hire_date DESC) AS rn
FROM employees;

Penomboran Dalam Partisi

Tambahkan PARTITION BY untuk menomborkan baris secara berasingan dalam setiap kumpulan. Pembilang bermula semula pada 1 bagi setiap nilai partisi baharu.

Dalam contoh ini, setiap jabatan mendapat urutan 1, 2, 3 sendiri yang disusun mengikut gaji. Pekerja berpendapatan tertinggi dalam setiap jabatan mendapat nombor 1 — asas kepada pola N teratas bagi setiap kumpulan.

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

ROW_NUMBER dan Seri: Tiada Seri

Perkara penting dalam temu duga: apabila dua baris mempunyai nilai susunan yang sama, ROW_NUMBER tetap memberikan nombor yang berbeza kepada kedua-duanya. Baris yang menerima nombor lebih rendah tidak dapat ditentukan secara deterministik melainkan anda menambahkan lajur pemecah seri.

  • RANK akan memberikan kedudukan yang sama kepada baris yang seri.
  • ROW_NUMBER menentukan susunan antara baris tersebut secara tidak tentu.

Untuk mendapatkan hasil yang boleh dihasilkan semula, sentiasa tambahkan pemecah seri unik pada ORDER BY.

SELECT
  name,
  salary,
  ROW_NUMBER() OVER (
    ORDER BY salary DESC, employee_id  -- employee_id breaks ties deterministically
  ) AS rn
FROM employees;

Peraturan Pemecah Seri Deterministik

Jika ORDER BY anda bukan susunan ketat (tiada gabungan lajur yang unik), penomboran baris boleh berubah antara pelaksanaan, walaupun pada data yang sama. Penemu duga sengaja memasukkan perangkap ini dalam soalan penomboran halaman dan “rekod terkini”.

Panduan umum: tambahkan kunci utama atau lajur unik yang lain sebagai kunci susunan terakhir apabila hasil mesti stabil.

-- Unstable: many rows can share the same created_at
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC)

-- Stable: id guarantees a single deterministic winner
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC, id DESC)

Contoh Lengkap: Pesanan Terkini bagi Setiap Pelanggan

Soalan lazim: “Kembalikan pesanan paling terkini bagi setiap pelanggan.” Nomborkan pesanan bagi setiap pelanggan mengikut tarikh secara menurun, kemudian kekalkan rn = 1 dalam pertanyaan luar.

Oleh sebab ROW_NUMBER menjamin tepat satu baris bernombor 1 bagi setiap partisi, anda mendapat tepat satu baris bagi setiap pelanggan — tiada pendua walaupun dua pesanan berkongsi cap masa (pemecah seri menyelesaikannya).

SELECT customer_id, order_id, order_date, amount
FROM (
  SELECT
    customer_id, order_id, order_date, amount,
    ROW_NUMBER() OVER (
      PARTITION BY customer_id
      ORDER BY order_date DESC, order_id DESC
    ) AS rn
  FROM orders
) t
WHERE rn = 1;

Contoh Lengkap: Membuang Pendua Baris

ROW_NUMBER ialah alat paling kemas untuk membuang pendua. Bahagikan mengikut lajur yang mentakrifkan pendua, susun mengikut peraturan keutamaan, kemudian kekalkan rn = 1.

Di sini, kami menganggap baris dengan e-mel yang sama sebagai pendua dan mengekalkan baris yang dicipta paling awal. Semua baris dengan rn > 1 ialah pendua yang boleh anda padamkan atau abaikan.

SELECT id, email, created_at
FROM (
  SELECT
    id, email, created_at,
    ROW_NUMBER() OVER (
      PARTITION BY email
      ORDER BY created_at ASC, id ASC
    ) AS rn
  FROM users
) t
WHERE rn = 1;

ROW_NUMBER untuk Penomboran Halaman

Sebelum OFFSET/FETCH digunakan secara meluas, ROW_NUMBER digunakan untuk penomboran halaman, dan ia masih digunakan dalam SQL Server serta banyak tugasan ETL. Nomborkan baris dalam susunan yang stabil, kemudian tapis julat bernombor dalam pertanyaan luar.

Berhati-hati semasa temu duga: penomboran halaman hanya betul jika susunannya deterministik — jika tidak, baris yang sama boleh muncul pada dua halaman atau dilangkau sepenuhnya.

SELECT *
FROM (
  SELECT *, ROW_NUMBER() OVER (ORDER BY created_at, id) AS rn
  FROM articles
) t
WHERE rn BETWEEN 21 AND 40;  -- page 2, 20 per page

Menetapkan Urutan untuk Menyusun Semula Data

Kadangkala anda hanya memerlukan indeks berjujukan, contohnya untuk menomborkan semula baris selepas pengisihan, membina penanda 1..N atau memadankan baris dengan siri yang dijana. ROW_NUMBER mengikut susunan yang dikehendaki menghasilkan urutan padat yang kemas tanpa jurang.

Beginilah caranya anda memberikan kedudukan stabil kepada himpunan tanpa susunan tertentu untuk digunakan dalam cantuman kemudian.

SELECT
  ROW_NUMBER() OVER (ORDER BY score DESC, player_id) AS leaderboard_position,
  player_id,
  score
FROM scores;

ROW_NUMBER berbanding COUNT untuk Baris Ke-N

Apabila ditanya tentang “pesanan terkini ke-3” atau “baris ke-2”, gunakan ROW_NUMBER dan tapis berdasarkan nilai tepat dalam pertanyaan luar. Oleh sebab penomborannya unik, rn = 3 mengembalikan tepat satu baris.

Bandingkan dengan RANK: jika anda mahukan nilai berbeza ke-2 (contohnya gaji kedua tertinggi termasuk seri), ROW_NUMBER ialah alat yang salah — anda memerlukan DENSE_RANK, yang akan dibincangkan dalam pelajaran seterusnya.

SELECT order_id, order_date
FROM (
  SELECT order_id, order_date,
         ROW_NUMBER() OVER (ORDER BY order_date DESC, order_id DESC) AS rn
  FROM orders
) t
WHERE rn = 3;  -- exactly the 3rd most recent order

Imbas Kembali Perangkap

Pastikan perkara berikut jelas semasa menghadapi tekanan temu duga:

  • ROW_NUMBER sentiasa unik dan tanpa jurang dalam sesuatu partisi.
  • Ia memerlukan ORDER BY dalam OVER; tanpa pemecah seri unik, hasil menjadi tidak tentu apabila berlaku seri.
  • Ia tidak boleh ditapis dalam WHERE — bungkusnya dalam subpertanyaan/CTE.
  • Gunakannya untuk satu baris bagi setiap kumpulan, pembuangan pendua dan penomboran halaman; gunakan DENSE_RANK apabila baris seri mesti berkongsi nombor.

Semakan Pantas

Bagaimanakah ROW_NUMBER mengendalikan baris yang seri pada nilai ORDER BY?

Imbas Kembali: Penjujukan Deterministik

ROW_NUMBER ialah alat anda untuk penomboran unik tanpa jurang dalam sesuatu partisi. Anda telah belajar untuk:

  • Menomborkan keseluruhan himpunan dan kumpulan bagi setiap partisi.
  • Menambahkan pemecah seri unik untuk mendapatkan hasil deterministik yang boleh dihasilkan semula.
  • Menyelesaikan masalah baris terkini bagi setiap kunci, pembuangan pendua, penomboran halaman dan baris ke-N dengan menapis rn dalam pertanyaan luar.

Seterusnya, anda akan melihat cara RANK dan DENSE_RANK sengaja memberikan nombor yang sama kepada baris seri — serta perbezaan tingkah laku jurangnya.

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 “ROW_NUMBER untuk Penjujukan Unik” percuma?

Ya — teks penuh “ROW_NUMBER untuk Penjujukan Unik” 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 “ROW_NUMBER untuk Penjujukan Unik”?

Berikan nombor baris yang tentu dalam setiap partition 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 “ROW_NUMBER untuk Penjujukan Unik” 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. 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 SQL