一尘不染

我该如何选择Oracle数据库中薪水第二高的记录?

sql

假设我有一个表为id,user_name,salary的雇员。我该如何选择Oracle中薪水第二高的记录?

我用谷歌搜索,找到了这个解决方案,对吗?

select sal from
     (select rownum n,a.* from
        ( select distinct sal from emp order by sal desc) a)
where n = 2;

阅读 138

收藏
2021-03-17

共1个答案

一尘不染

已经建议RANK和DENSE_RANK-根据您的要求,您还可以考虑ROW_NUMBER():

select * from (
  select e.*, row_number() over (order by sal desc) rn from emp e
)
where rn = 2;

RANK(),DENSE_RANK()和ROW_NUMBER()之间的差异归结为:

  • ROW_NUMBER()总是产生唯一的排名;如果ORDER BY子句无法区分两行,它将仍然为它们提供不同的排名(随机)
  • RANK()和DENSE_RANK()将为无法通过ORDER BY子句区分的行赋予相同的排名
  • DENSE_RANK()将始终生成连续的等级序列(1,2,3,…),而RANK()在具有相同等级的两行或更多行之后会留下空白(请考虑“奥运会”:如果两名运动员获胜金牌,没有第二名,只有第三名)

因此,如果您只想要一名员工(即使有几名员工的薪水排名第二),我建议您选择ROW_NUMBER()。

2021-03-17