Cách tốt nhất để làm điều này là sử dụng các hàm phân tích, RANK () hoặc 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 () nén các khoảng trống khi có sự ràng buộc:
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>
Hành vi nào bạn thích phụ thuộc vào yêu cầu kinh doanh của bạn.
Ngoài ra còn có hàm phân tích ROW_NUMBER () mà chúng tôi có thể sử dụng để trả về một số hàng chính xác. Tuy nhiên, chúng ta nên tránh sử dụng các giải pháp dựa trên số hàng trừ khi logic nghiệp vụ vui lòng tự ý cắt ngắn tập kết quả trong trường hợp hòa. Có sự khác biệt giữa việc yêu cầu năm giá trị cao nhất và năm bản ghi đầu tiên được sắp xếp theo giá trị cao
Ngoài ra còn có một giải pháp không phân tích bằng cách sử dụng cột giả ROWNUM. Điều này thật khó hiểu vì ROWNUM được áp dụng trước mệnh đề ORDER BY, điều này có thể dẫn đến kết quả không mong muốn. Hiếm khi có bất kỳ lý do nào để sử dụng ROWNUM thay vì ROW_NUMBER () hoặc một trong các hàm xếp hạng.