Ruang penulis
← Kembali ke jurnal
Oracle

Fungsi analitik Oracle: RANK dan ROW_NUMBER untuk laporan

Gunakan fungsi analitik untuk membuat peringkat data tanpa subquery yang rumit.

DTim Diary Coding · 05 Sep 2026 · 1 menit baca

Kebutuhan membuat peringkat

Laporan penjualan sering membutuhkan peringkat, misalnya tiga produk terlaris per kategori. Fungsi analitik Oracle menghitung ini langsung dalam satu query tanpa join berulang.

SELECT
    kategori,
    nama_produk,
    total_terjual,
    RANK() OVER (
        PARTITION BY kategori
        ORDER BY total_terjual DESC
    ) AS peringkat
FROM ringkasan_penjualan;

Perbedaan RANK, DENSE_RANK, dan ROW_NUMBER

RANK melompati nomor berikutnya jika ada nilai yang sama, DENSE_RANK tidak melompat, sedangkan ROW_NUMBER selalu memberi nomor berurutan meski nilainya sama.

SELECT
    nama_produk,
    total_terjual,
    RANK() OVER (ORDER BY total_terjual DESC) AS rank_biasa,
    DENSE_RANK() OVER (ORDER BY total_terjual DESC) AS dense_rank,
    ROW_NUMBER() OVER (ORDER BY total_terjual DESC) AS nomor_baris
FROM ringkasan_penjualan;

Mengambil N teratas per grup

Bungkus query analitik sebagai subquery, lalu saring hasilnya di query luar karena fungsi analitik tidak bisa langsung dipakai di klausa WHERE.

SELECT * FROM (
    SELECT
        kategori,
        nama_produk,
        RANK() OVER (PARTITION BY kategori ORDER BY total_terjual DESC) AS peringkat
    FROM ringkasan_penjualan
)
WHERE peringkat <= 3;

PARTITION BY mengelompokkan perhitungan

Tanpa PARTITION BY, peringkat dihitung untuk seluruh tabel. Dengan PARTITION BY kategori, peringkat dihitung ulang mulai dari 1 pada setiap kategori.

Latihan

Ubah query di atas untuk menampilkan lima produk terlaris secara keseluruhan, tanpa dikelompokkan per kategori.

← Jelajahi catatan lainnya