ROW_NUMBER untuk Pengurutan Unik
Tetapkan nomor baris deterministik dalam setiap partisi.
ROW_NUMBER untuk Pengurutan Unik adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Jaminan yang Diberikan ROW_NUMBER
ROW_NUMBER() menetapkan bilangan bulat unik tanpa celah pada setiap baris di dalam partisinya, dimulai dari 1 dan mengikuti ORDER BY pada jendela. Tidak ada dua baris yang pernah memiliki nomor yang sama, bahkan ketika nilai pengurutannya identik.
Keunikan inilah yang membuat pewawancara menggunakannya untuk menyelesaikan masalah "memilih satu baris per kelompok" dan deduplikasi. Fungsi pemeringkatan lainnya (RANK, DENSE_RANK) tidak menjamin keunikan ketika terjadi seri.
Kueri ROW_NUMBER Minimal
Bentuk paling sederhana memberi nomor pada seluruh kumpulan hasil dalam urutan yang dipilih. ROW_NUMBER selalu memerlukan ORDER BY di dalam OVER — tanpanya, penomoran akan sembarang, dan sebagian besar mesin basis data akan menolaknya atau memberikan peringatan.
Di sini, karyawan yang paling baru direkrut menjadi baris 1 jika Anda mengurutkan berdasarkan tanggal perekrutan secara menurun.
SELECT
name,
hire_date,
ROW_NUMBER() OVER (ORDER BY hire_date DESC) AS rn
FROM employees;Penomoran dalam Partisi
Tambahkan PARTITION BY untuk memberi nomor pada baris secara independen di dalam setiap kelompok. Penghitung dimulai kembali dari 1 pada setiap nilai partisi yang baru.
Dalam contoh ini, setiap departemen memiliki urutan 1, 2, 3 sendiri yang diurutkan berdasarkan gaji. Karyawan bergaji tertinggi di setiap departemen mendapat nomor 1 — dasar dari pola N teratas per kelompok.
SELECT
department,
name,
salary,
ROW_NUMBER() OVER (
PARTITION BY department
ORDER BY salary DESC
) AS dept_rn
FROM employees;ROW_NUMBER dan Seri: Tidak Ada Seri
Poin penting dalam wawancara: ketika dua baris memiliki nilai pengurutan yang sama, ROW_NUMBER tetap memberi keduanya nomor yang berbeda. Baris mana yang mendapat nomor lebih rendah bersifat tidak deterministik, kecuali Anda menambahkan kolom pemecah seri.
RANKakan memberikan peringkat yang sama kepada baris-baris yang seri.ROW_NUMBERmemilih urutan di antara baris-baris tersebut secara sembarang.
Agar hasil dapat direproduksi, selalu tambahkan kolom pemecah seri yang unik ke dalam ORDER BY.
SELECT
name,
salary,
ROW_NUMBER() OVER (
ORDER BY salary DESC, employee_id -- employee_id breaks ties deterministically
) AS rn
FROM employees;Aturan Kolom Pemecah Seri Deterministik
Jika ORDER BY Anda bukan pengurutan ketat (tidak ada kombinasi kolom yang unik), penomoran baris dapat berubah antarpelaksanaan, bahkan pada data yang sama. Pewawancara sengaja menyisipkan jebakan ini dalam pertanyaan tentang paginasi dan "rekaman terbaru".
Aturan praktis: tambahkan kunci utama atau kolom unik lainnya sebagai kunci pengurutan terakhir kapan pun hasil harus 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 Terapan: Pesanan Terbaru untuk Setiap Pelanggan
Pertanyaan yang sering muncul: "Kembalikan pesanan terbaru setiap pelanggan." Beri nomor pada pesanan per pelanggan berdasarkan tanggal secara menurun, lalu pertahankan rn = 1 dalam kueri luar.
Karena ROW_NUMBER menjamin tepat satu baris bernomor 1 per partisi, Anda mendapatkan tepat satu baris per pelanggan — tanpa duplikasi meskipun dua pesanan memiliki cap waktu yang sama (kolom 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 Terapan: Menghapus Duplikasi Baris
ROW_NUMBER adalah alat paling rapi untuk menghapus duplikasi. Buat partisi berdasarkan kolom yang menentukan duplikasi, urutkan berdasarkan aturan preferensi, lalu pertahankan rn = 1.
Di sini, kami menganggap baris dengan email yang sama sebagai duplikat dan mempertahankan baris yang dibuat paling awal. Semua baris dengan rn > 1 adalah duplikat yang dapat Anda hapus 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 Paginasi
Sebelum OFFSET/FETCH digunakan secara universal, ROW_NUMBER menjadi penggerak paginasi, dan masih demikian di SQL Server serta banyak pekerjaan ETL. Beri nomor pada baris dalam urutan yang stabil, lalu filter rentang bernomor dalam kueri luar.
Perhatian dalam wawancara: paginasi hanya benar jika pengurutannya deterministik — jika tidak, baris yang sama dapat muncul di dua halaman atau terlewat seluruhnya.
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 Mengurutkan Ulang Data
Terkadang Anda hanya memerlukan indeks berurutan, misalnya untuk memberi nomor ulang pada baris setelah pengurutan, membuat label 1..N, atau memasangkan baris dengan deret yang dibuat. ROW_NUMBER berdasarkan urutan yang diinginkan menghasilkan urutan rapat yang bersih tanpa celah.
Cara ini juga memungkinkan Anda memberikan posisi stabil pada kumpulan tak berurutan untuk digunakan dalam penggabungan nanti.
SELECT
ROW_NUMBER() OVER (ORDER BY score DESC, player_id) AS leaderboard_position,
player_id,
score
FROM scores;ROW_NUMBER vs COUNT untuk 'Baris ke-N'
Saat diminta mencari "pesanan terbaru ke-3" atau "baris ke-2", gunakan ROW_NUMBER dan filter berdasarkan nilai tepat tersebut dalam kueri luar. Karena penomorannya unik, rn = 3 mengembalikan tepat satu baris.
Bandingkan dengan RANK: jika Anda menginginkan nilai berbeda ke-2 (misalnya, gaji tertinggi kedua dengan nilai seri), ROW_NUMBER bukan alat yang tepat — Anda memerlukan DENSE_RANK, yang dibahas dalam pelajaran berikutnya.
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 orderRangkuman Jebakan
Pahami hal-hal berikut saat berada di bawah tekanan wawancara:
ROW_NUMBERselalu unik dan tanpa celah di dalam partisi.- Fungsi ini memerlukan
ORDER BYdalamOVER; tanpa kolom pemecah seri yang unik, hasilnya tidak deterministik ketika terjadi seri. - Fungsi ini tidak dapat difilter dalam
WHERE— bungkus dalam subkueri/CTE. - Gunakan fungsi ini untuk satu baris per kelompok, deduplikasi, dan paginasi; gunakan
DENSE_RANKketika nilai seri harus berbagi nomor.
Uji Cepat
Bagaimana ROW_NUMBER menangani baris yang memiliki nilai sama pada ORDER BY?
Rangkuman: Pengurutan Deterministik
ROW_NUMBER adalah alat Anda untuk penomoran unik tanpa celah di dalam partisi. Anda telah mempelajari cara:
- Memberi nomor pada seluruh kumpulan dan kelompok per partisi.
- Menambahkan kolom pemecah seri yang unik untuk mendapatkan hasil yang deterministik dan dapat direproduksi.
- Menyelesaikan masalah baris terbaru per kunci, deduplikasi, paginasi, dan baris ke-N dengan memfilter
rndalam kueri luar.
Selanjutnya, Anda akan melihat bagaimana RANK dan DENSE_RANK secara sengaja memberikan nomor yang sama kepada nilai seri — serta bagaimana perilaku celahnya berbeda.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “ROW_NUMBER untuk Pengurutan Unik” gratis?
Ya — teks lengkap “ROW_NUMBER untuk Pengurutan Unik” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “ROW_NUMBER untuk Pengurutan Unik”?
Tetapkan nomor baris deterministik dalam setiap partisi. Kamu berlatih SQL Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai SQL Interview Prep?
Tidak diperlukan pengalaman sebelumnya. SQL Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “ROW_NUMBER untuk Pengurutan Unik” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Interview Prep ini?
Ya. Setiap pelajaran SQL Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- OVER, PARTITION BY, dan ORDER BY
- ROW_NUMBER untuk Pengurutan Unik
- RANK vs DENSE_RANK pada Nilai Seri
- Memfilter Hasil Jendela