Kursus
Saat bekerja dengan SQL, mengurutkan data itu mudah karena Anda dapat dengan mudah menggunakan ORDER BY untuk menyusun baris. Namun, hanya mengurutkan hasil tidak memberi tahu posisi setiap baris dalam urutan tersebut. Di sinilah peringkat menjadi berguna. Alih-alih hanya melihat data yang diurutkan, Anda mungkin ingin memberikan posisi seperti ke-1, ke-2, atau ke-3 pada setiap baris berdasarkan kriteria tertentu.
Fungsi RANK() menyelesaikan masalah ini dengan memberikan peringkat numerik pada setiap baris sesuai urutan yang ditentukan. RANK() adalah bagian dari fungsi jendela (window functions) SQL, yang memungkinkan Anda melakukan perhitungan pada satu set baris sambil tetap mengembalikan hasil per baris.
Dalam tutorial ini, saya akan menunjukkan sintaks RANK(), contoh praktis, memahami bagaimana fungsi ini menangani nilai seri, dan melihat perbandingannya dengan fungsi serupa seperti DENSE_RANK() dan ROW_NUMBER().
Jika Anda baru dalam SQL, mulai dari Introduction to SQL kami, atau Intermediate SQL jika Anda sudah memiliki sedikit pengalaman.
Apa Itu Fungsi SQL RANK()?
Fungsi SQL RANK() adalah sebuah fungsi jendela yang memberikan peringkat pada setiap baris berdasarkan urutan yang ditentukan. Pemberian peringkat sepenuhnya ditentukan oleh ORDER BY di dalam fungsi jendela. Jadi, fungsi ini memberi setiap baris posisi seperti 1, 2, 3, dan seterusnya, sesuai dengan klausa ORDER BY.
Perlu dicatat bahwa ketika Anda menggunakan RANK():
- Baris dengan nilai yang sama (seri/tie) menerima peringkat yang sama.
- Saat terjadi seri, akan ada celah dalam urutan peringkat. Misalnya, jika dua baris berada di peringkat 2, maka peringkat berikutnya adalah 4, bukan 3.
Sintaks SQL RANK()
Sintaks dasar fungsi RANK() adalah:
RANK() OVER (ORDER BY column)
Di mana:
-
OVERclause: Mendefinisikan jendela (kumpulan baris) tempat fungsi dijalankan. -
ORDER BY: Menentukan bagaimana peringkat diterapkan, misalnya dari tertinggi ke terendah. -
PARTITION BY(opsional): Membagi data menjadi beberapa grup, memberi peringkat baris secara terpisah dalam setiap grup.
Berikut adalah sintaks fungsi RANK() dengan klausa PARTITION BY:
RANK() OVER (PARTITION BY column1 ORDER BY column2)
Fungsi SQL RANK() didukung luas di berbagai basis data besar, termasuk PostgreSQL, MySQL (8.0+), Microsoft SQL Server, dan Oracle Database. Sintaksnya sebagian besar konsisten di seluruh sistem ini, karena merupakan bagian dari spesifikasi standar ANSI SQL.
Contoh Dasar SQL RANK()
Sekarang setelah Anda memahami sintaks fungsi RANK(), saya akan menunjukkan contoh sederhana bagaimana cara kerjanya.
Misalkan Anda memiliki tabel employees dengan informasi gaji setiap karyawan.

Anda dapat menggunakan kueri berikut untuk memberi peringkat karyawan berdasarkan gajinya.
-- Rank employees by salary
SELECT
name,
salary,
RANK() OVER (ORDER BY salary DESC) AS rank_position
FROM employees;
Pada kueri di atas, baris diurutkan berdasarkan gaji dari yang tertinggi, sehingga gaji tertinggi mendapatkan peringkat 1. Ketika dua baris memiliki gaji yang sama, keduanya menerima peringkat yang sama.

Anda akan melihat bahwa jika dua baris memiliki nilai yang sama, keduanya menerima peringkat yang sama.
Kemudian peringkat berikutnya dilewati. SQL memperhitungkan seri dengan melewati nilai peringkat berikutnya.
Saya merekomendasikan mengikuti kursus Introduction to SQL Server kami untuk mempelajari lebih lanjut tentang pengelompokan dan agregasi data.
SQL RANK() dengan PARTITION BY
Seperti yang telah kita pelajari sebelumnya, klausa PARTITION BY memungkinkan Anda menerapkan peringkat di dalam grup alih-alih di seluruh dataset.
Pada contoh di bawah, karyawan dikelompokkan berdasarkan department, dan peringkat dimulai dari awal di setiap departemen. Oleh karena itu, setiap grup memiliki urutan peringkatnya sendiri yang independen.
-- Rank employees within each department
SELECT
name,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;

Dari hasil di atas, kita dapat melihat bahwa di “Sales”, Emily Johnson dan Michael Brown sama-sama mendapat peringkat 1, sementara di “HR”, William Miller dan Olivia Wilson juga sama-sama mendapat peringkat 1.
SQL RANK() vs. DENSE_RANK() vs. ROW_NUMBER()
Saat memberi peringkat data di SQL, Anda dapat memilih menggunakan RANK(), DENSE_RANK(), atau ROW_NUMBER(). Fungsi-fungsi ini mungkin terlihat serupa, tetapi berperilaku sebagai berikut:
-
RANK(): Nilai seri berbagi peringkat yang sama, sehingga muncul celah setelah seri. -
DENSE_RANK(): Nilai seri berbagi peringkat yang sama, sehingga tidak ada celah dalam peringkat. -
ROW_NUMBER(): Setiap baris mendapatkan nomor unik tanpa seri, bahkan jika nilainya sama.
Untuk lebih memahami perbedaan ini, mari lakukan perbandingan berdampingan menggunakan kueri berikut:
-- Compare RANK() vs DENSE_RANK() vs ROW_NUMBER()
SELECT
name,
salary,
RANK() OVER (ORDER BY salary DESC) AS rank_val, -- allows gaps after ties
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank1, -- no gaps, consecutive ranks
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num -- always unique sequence
FROM employees;

Dari hasil di atas, Anda dapat memilih untuk:
-
Gunakan
RANK()ketika posisi penting, dan celah dapat diterima. -
Gunakan
DENSE_RANK()ketika Anda menginginkan peringkat yang berkelanjutan tanpa celah. -
Gunakan
ROW_NUMBER()ketika setiap baris harus memiliki nomor unik, seperti pada paginasi data.
Kapan Menggunakan SQL RANK()
Fungsi SQL RANK() paling berguna ketika Anda ingin mengurutkan data sambil menangani nilai seri secara alami. Saya juga menganggapnya penting untuk kasus penggunaan berikut:
- Papan peringkat: Ketika Anda ingin memberi peringkat pemain atau pengguna berdasarkan skor, dengan mengizinkan seri untuk performa yang setara.
- Peringkat kinerja penjualan: jika Anda ingin mengidentifikasi karyawan atau wilayah dengan kinerja terbaik berdasarkan pendapatan, bahkan ketika hasilnya sama.
- Mengidentifikasi nilai Top-N: Berguna untuk kueri seperti “3 gaji teratas”, terutama ketika seri harus disertakan.
Kesalahan Umum dengan SQL RANK()
Berikut beberapa kesalahan yang pernah saya temui saat menggunakan fungsi SQL RANK(), dan cara menghindarinya:
-
Lupa menambahkan ORDER BY: Tanpa klausa
ORDER BY, peringkat tidak memiliki logika yang jelas dan dapat menghasilkan hasil yang tidak terduga. -
Salah paham perilaku seri: Sebagai pemula, Anda mungkin mengharapkan 1, 2, 2, 3, tetapi
RANK()menghasilkan celah (1, 2, 2, 4) pada peringkat. -
Menggunakan RANK() saat sebenarnya membutuhkan ROW_NUMBER(): Jika Anda memerlukan nilai berurutan yang unik,
ROW_NUMBER()adalah pilihan yang lebih tepat. -
Tidak menggunakan PARTITION BY saat diperlukan: Tanpa partisi, peringkat diterapkan secara global alih-alih di dalam grup.
Praktik Terbaik Menggunakan SQL RANK()
Agar kueri Anda tetap rapi dan memastikan hasil sesuai ekspektasi, saya menyarankan mengikuti praktik terbaik berikut saat menggunakan fungsi SQL RANK():
-
Selalu tentukan pengurutan yang jelas: Nyatakan secara eksplisit pada klausa
ORDER BY, sepertiDESC, untuk menghindari peringkat yang ambigu. -
Pilih fungsi peringkat yang tepat: Gunakan
RANK(),DENSE_RANK(), atauROW_NUMBER()berdasarkan bagaimana Anda ingin menangani seri. -
Uji skenario seri: Sebelum ke produksi, verifikasi bagaimana data Anda berperilaku saat ada nilai duplikat.
-
Kombinasikan dengan pemfilteran: Karena Anda tidak dapat menggunakan
RANK()langsung di klausaWHERE, Anda harus membungkus kueri peringkat Anda dalam sebuah Subquery atau CTE saat Anda ingin memfilter “Top N”.
Kesimpulan
RANK() adalah alat yang berguna untuk membuat perbandingan berurutan dalam SQL, terutama ketika Anda memerlukan hasil yang mencerminkan skenario dunia nyata seperti nilai yang sama. Memahami bagaimana fungsi ini menangani seri dan mengapa peringkat bisa berulang serta melewati angka penting untuk analisis yang akurat. Setelah Anda menguasai perilaku ini, Anda dapat mengetahui kapan harus memilihnya bersama alternatif seperti DENSE_RANK() dan ROW_NUMBER(), berdasarkan apa yang paling sesuai dengan kasus penggunaan spesifik Anda.
Sekarang setelah Anda mempelajari cara memberi peringkat data di SQL, saya merekomendasikan untuk melihat Associate Data Analyst in SQL career track kami jika Anda berminat menjadi analis data yang andal untuk mempelajari keterampilan yang diperlukan. Kursus Reporting in SQL kami juga tepat jika Anda ingin belajar membangun dasbor profesional menggunakan SQL.
SQL RANK() FAQs
Apa perbedaan RANK() dengan ORDER BY?
ORDER BY hanya mengurutkan baris, sedangkan RANK() memberikan posisi numerik pada setiap baris setelah diurutkan.
Mengapa ada celah dalam hasil RANK()?
Celah dapat muncul dalam hasil RANK() karena beberapa baris berbagi peringkat yang sama saat ada seri, sehingga mendorong peringkat berikutnya ke depan.
Apa perbedaan antara RANK() dan DENSE_RANK()?
RANK() membuat celah setelah seri, sedangkan DENSE_RANK() memberikan peringkat berurutan tanpa celah.
Apa perbedaan antara RANK() dan ROW_NUMBER()?
RANK() mengizinkan seri, tetapi ROW_NUMBER() memberikan nomor unik ke setiap baris terlepas dari duplikasi.
Apakah RANK() didukung di semua basis data?
Sebagian besar basis data modern mendukung RANK(), termasuk PostgreSQL, MySQL (8.0+), Microsoft SQL Server, dan Oracle Database.

