ROW_NUMBER untuk Penjujukan Unik
Berikan nombor baris yang tentu dalam setiap partition
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.
RANKakan memberikan kedudukan yang sama kepada baris yang seri.ROW_NUMBERmenentukan 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 pageMenetapkan 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 orderImbas Kembali Perangkap
Pastikan perkara berikut jelas semasa menghadapi tekanan temu duga:
ROW_NUMBERsentiasa unik dan tanpa jurang dalam sesuatu partisi.- Ia memerlukan
ORDER BYdalamOVER; 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_RANKapabila 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
rndalam pertanyaan luar.
Seterusnya, anda akan melihat cara RANK dan DENSE_RANK sengaja memberikan nombor yang sama kepada baris seri — serta perbezaan tingkah laku jurangnya.
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
- OVER, PARTITION BY dan ORDER BY
- ROW_NUMBER untuk Penjujukan Unik
- RANK berbanding DENSE_RANK apabila Seri
- Menapis Keputusan Tetingkap