Fungsi analitik Oracle: RANK dan ROW_NUMBER untuk laporan
Gunakan fungsi analitik untuk membuat peringkat data tanpa subquery yang rumit.
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.
