Saya pikir fungsi Rank() bukan cara yang tepat untuk ini, karena dua alasan.
Pertama, metode ini mungkin kurang efisien dibandingkan metode berbasis Min().
Alasan untuk ini adalah bahwa kueri harus mempertahankan daftar pesanan semua gaji per departemen saat memindai data, dan peringkat kemudian akan ditetapkan kemudian dengan membaca ulang daftar ini. Jelas dengan tidak adanya indeks yang dapat dimanfaatkan untuk ini, Anda tidak dapat menetapkan peringkat sampai item data terakhir telah dibaca, dan pemeliharaan daftar itu mahal.
Jadi, kinerja fungsi Rank() bergantung pada jumlah total elemen yang akan dipindai, dan jika jumlahnya cukup sehingga pengurutan tumpah ke disk, maka kinerja akan runtuh.
Ini mungkin lebih efisien:
select dept,
emp,
salary
from
(
SELECT dept,
emp,
salary,
Min(salary) Over (Partition By dept) min_salary
FROM mytable
)
where salary = min_salary
/
Metode ini hanya mengharuskan kueri mempertahankan satu nilai per departemen dari nilai minimum yang ditemui sejauh ini. Jika minimum baru ditemukan maka nilai yang ada diubah, jika tidak, nilai baru akan dibuang. Jumlah total elemen yang harus disimpan dalam memori terkait dengan jumlah departemen, bukan jumlah baris yang dipindai.
Bisa jadi Oracle memiliki jalur kode untuk mengenali bahwa Peringkat tidak benar-benar perlu dihitung dalam kasus ini, tetapi saya tidak akan bertaruh untuk itu.
Alasan kedua untuk tidak menyukai Rank() adalah karena hanya menjawab pertanyaan yang salah. Pertanyaannya bukan "Catatan mana yang memiliki gaji yang menempati peringkat pertama ketika gaji per departemen diurutkan secara menaik", melainkan "Catatan mana yang memiliki gaji minimum per departemen". Itu membuat perbedaan besar bagi saya, setidaknya.