SQL Academy · Pelajaran

ROW_NUMBER, RANK, DENSE_RANK

Nomborkan dan beri kedudukan kepada baris dalam partition, serta pilih fungsi kedudukan yang tepat apabila terdapat seri.

Pelajaran 2 daripada 413 langkah

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?

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

  1. OVER, PARTITION BY, ORDER BY
  2. ROW_NUMBER, RANK, DENSE_RANK
  3. LAG, LEAD dan Corak Siri Masa
  4. Jumlah Berjalan dan Purata Bergerak
← Kembali ke SQL Academy