RANK và DENSE_RANK đã được đề xuất - tùy thuộc vào yêu cầu của bạn, bạn cũng có thể xem xét ROW_NUMBER ():
select * from (
select e.*, row_number() over (order by sal desc) rn from emp e
)
where rn = 2;
Sự khác biệt giữa RANK (), DENSE_RANK () và ROW_NUMBER () tổng hợp thành:
- ROW_NUMBER () luôn tạo ra một xếp hạng duy nhất; nếu mệnh đề ORDER BY không thể phân biệt giữa hai hàng, nó sẽ vẫn cung cấp cho chúng các thứ hạng khác nhau (ngẫu nhiên)
- RANK () và DENSE_RANK () sẽ xếp hạng giống nhau cho các hàng không thể phân biệt bằng mệnh đề ORDER BY
- DENSE_RANK () sẽ luôn tạo ra một chuỗi xếp hạng liền kề (1,2,3, ...), trong khi RANK () sẽ để lại khoảng trống sau hai hoặc nhiều hàng có cùng thứ hạng (nghĩ rằng "Thế vận hội Olympic":nếu hai vận động viên giành huy chương vàng, không có vị trí thứ hai, chỉ có vị trí thứ ba)
Vì vậy, nếu bạn chỉ muốn một nhân viên (ngay cả khi có một số nhân viên có mức lương cao thứ 2), tôi khuyên bạn nên ROW_NUMBER ().