ROW_NUMBER, RANK, DENSE_RANK
Nomborkan dan beri kedudukan kepada baris dalam partition, serta pilih fungsi kedudukan yang tepat apabila terdapat seri.
ROW_NUMBER, RANK, DENSE_RANK ialah pelajaran SQL Academy 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 SQL Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.
Tiga Fungsi Penomboran
Tiga fungsi tetingkap yang menomborkan baris dalam sesuatu partition:
ROW_NUMBER()— 1, 2, 3, 4 (sentiasa unik)RANK()— 1, 2, 2, 4 (kedudukan seri sama, kemudian melangkau)DENSE_RANK()— 1, 2, 2, 3 (kedudukan seri sama, tanpa melangkau)
ROW_NUMBER
Menetapkan 1, 2, 3 dalam setiap partition. Kedudukan seri dipecahkan secara rawak — berikan penentu seri dalam ORDER BY untuk hasil yang konsisten:
SELECT id, user_id, total,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY total DESC, id
) AS rn
FROM orders;N Teratas bagi Setiap Kumpulan
Penggunaan ROW_NUMBER yang klasik:
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY total DESC
) AS rn
FROM orders
)
SELECT * FROM ranked WHERE rn <= 3;
-- Each user's top 3 orders.RANK
Baris dengan nilai ORDER BY yang sama menerima kedudukan yang sama; nilai berbeza seterusnya melangkaui jurang tersebut:
-- totals: 100, 90, 90, 70
-- RANK: 1, 2, 2, 4 (skipped 3)
SELECT id, total,
RANK() OVER (ORDER BY total DESC) AS rk
FROM orders;DENSE_RANK
Sama seperti RANK tetapi tanpa jurang:
-- totals: 100, 90, 90, 70
-- DENSE: 1, 2, 2, 3
SELECT id, total,
DENSE_RANK() OVER (ORDER BY total DESC) AS dr
FROM orders;Memilih antara Fungsi-fungsi Ini
- Perlukan nombor unik (contohnya penomboran halaman)?
ROW_NUMBER - Perlukan kedudukan dengan kaedah tradisional "kedudukan seri melangkau"?
RANK - Perlukan kedudukan dengan kaedah "kedudukan seri sama, yang seterusnya ialah nombor berikutnya"?
DENSE_RANK
NTILE: Baldi Kuantil-N
NTILE(n) mengagihkan baris kepada n baldi yang lebih kurang sama saiz:
SELECT id, total,
NTILE(4) OVER (ORDER BY total) AS quartile
FROM orders;
-- 1 = bottom 25%, 4 = top 25%Mengalih Keluar Baris Pendua
Gunakan ROW_NUMBER + DELETE untuk mengekalkan satu baris bagi setiap kumpulan pendua:
WITH dups AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
FROM users
)
DELETE FROM users WHERE id IN (SELECT id FROM dups WHERE rn > 1);Penomboran Halaman bagi Setiap Kumpulan
Halaman 2 bagi "pesanan setiap pengguna, 5 setiap halaman":
WITH r AS (
SELECT id, user_id,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
FROM orders
)
SELECT * FROM r WHERE rn BETWEEN 6 AND 10;PERCENT_RANK dan CUME_DIST
Kedudukan relatif dalam partition:
SELECT id, total,
PERCENT_RANK() OVER (ORDER BY total) AS pct_rank,
CUME_DIST() OVER (ORDER BY total) AS cume_dist
FROM orders;Prestasi
Fungsi penomboran memerlukan input yang diisih dalam setiap partition. Indeks pada (partition_col, order_col) boleh mengelakkan langkah pengisihan.
Imbas Kembali
Tiga fungsi penomboran merangkumi kebanyakan keperluan.
- ROW_NUMBER untuk keunikan
- RANK / DENSE_RANK untuk kedudukan dengan seri
- NTILE untuk baldi kuantil
Semakan Pantas
Diberikan jumlah 100, 90, 90, 70, apakah hasil yang dikeluarkan oleh DENSE_RANK?
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
- 46
- Pelajaran
- 183
Soalan Lazim
Adakah pelajaran “ROW_NUMBER, RANK, DENSE_RANK” percuma?
Ya — teks penuh “ROW_NUMBER, RANK, DENSE_RANK” 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 SQL Academy, tingkat taraf kepada CoddyKit PRO. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “ROW_NUMBER, RANK, DENSE_RANK”?
Nomborkan dan beri kedudukan kepada baris dalam partition, serta pilih fungsi kedudukan yang tepat apabila terdapat seri. Anda berlatih SQL Academy 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 SQL Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran SQL Academy 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, RANK, DENSE_RANK” 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 SQL Academy ini?
Ya. Setiap pelajaran SQL Academy 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, ORDER BY
- ROW_NUMBER, RANK, DENSE_RANK
- LAG, LEAD dan Corak Siri Masa
- Jumlah Berjalan dan Purata Bergerak