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

use*_*838 4 sql oracle

假设我有一个表名为employee,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;
Run Code Online (Sandbox Code Playgroud)

Fra*_*itt 22

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

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

RANK(),DENSE_RANK()和ROW_NUMBER()之间的区别归结为:

  • ROW_NUMBER()始终生成唯一的排名; 如果ORDER BY子句不能区分两行,它仍会给它们不同的排名(随机)
  • RANK()和DENSE_RANK()将对ORDER BY子句无法区分的行赋予相同的排名
  • DENSE_RANK()将始终生成一个连续的等级序列(1,2,3,...),而RANK()将在两个或更多行具有相同等级后留下空隙(想想"奥运会":如果两个运动员获胜金牌,没有第二名,只有第三名)

所以,如果你只想要一个员工(即使有几个人的薪水排名第二),我建议你推荐ROW_NUMBER().

  • +1用RANK和DENSE_RANK与'Olymic games'的例子进行了很好的理解. (2认同)

hd1*_*hd1 5

如果您使用的是Oracle 8+,则可以使用RANK()DENSE_RANK()函数,如下所示

SELECT *
FROM (
  SELECT some_column, 
         rank() over (order by your_sort_column desc) as row_rank
) t
WHERE row_rank = 2;
Run Code Online (Sandbox Code Playgroud)

  • 分析功能已在8.1.7中提供 (3认同)