Cara terbaik untuk melakukannya adalah dengan fungsi analitik, RANK() atau DENSE_RANK() ...
SQL> select * from (
2 select empno
3 , sal
4 , rank() over (order by sal desc) as rnk
5 from emp)
6 where rnk <= 5
7 /
EMPNO SAL RNK
---------- ---------- ----------
7839 5000 1
7788 3000 2
7902 3000 2
7566 2975 4
8083 2850 5
7698 2850 5
6 rows selected.
SQL>
DENSE_RANK() mengompresi celah ketika ada seri:
SQL> select * from (
2 select empno
3 , sal
4 , dense_rank() over (order by sal desc) as rnk
5 from emp)
6 where rnk <= 5
7 /
EMPNO SAL RNK
---------- ---------- ----------
7839 5000 1
7788 3000 2
7902 3000 2
7566 2975 3
8083 2850 4
7698 2850 4
8070 2500 5
7 rows selected.
SQL>
Perilaku mana yang Anda sukai tergantung pada kebutuhan bisnis Anda.
Ada juga fungsi analitik ROW_NUMBER() yang dapat kita gunakan untuk mengembalikan jumlah baris yang tepat. Namun, kita harus menghindari penggunaan solusi berdasarkan nomor baris kecuali logika bisnis dengan senang hati memotong hasil yang ditetapkan jika terjadi seri. Ada perbedaan antara meminta lima nilai tertinggi dan lima catatan pertama diurutkan berdasarkan nilai tinggi
Ada juga solusi non-analitik menggunakan kolom semu ROWNUM. Ini kikuk karena ROWNUM diterapkan sebelum klausa ORDER BY, yang dapat menyebabkan hasil yang tidak diharapkan. Jarang ada alasan untuk menggunakan ROWNUM alih-alih ROW_NUMBER() atau salah satu fungsi peringkat.