sql - 如何找到工资第二高的员工?

标签 sql oracle top-n

是否有任何预定义的函数或方法可用于从员工表中获取第二高的薪水?

最佳答案

这样做的方法是使用 Oracle 的分析功能。您的特定场景只是我在 another thread 中提供的解决方案的一个变体。

如果您只想选择第二高的薪水,那么 DENSE_RANK()、RANK() 和 ROW_NUMBER() 中的任何一个都可以解决问题:

SQL> select * from
  2   ( select sal
  3            , rank() over (order by sal desc) as rnk
  4     from
  5      ( select distinct sal
  6        from emp )
  7    )
  8  where rnk = 2
  9  /

       SAL        RNK
---------- ----------
      3000          2

SQL> 

但是,如果要选择附加信息,例如工资第二高的员工姓名,则选择的函数会影响结果。选择一个而不是另一个的主要原因是当有平局时会发生什么。

如果您使用 ROW_NUMBER() 它将返回按薪水排序的第二个员工:如果有两个员工并列最高薪水怎么办?如果有两名员工并列第二高的工资怎么办?如果您使用 RANK() 并且有两名员工并列第一高薪,则不会有 RANK = 2 的记录。

我建议 DENSE_RANK() 通常是在这些情况下选择的最安全的函数,但它确实取决于特定的业务需求。

关于sql - 如何找到工资第二高的员工?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2491063/

相关文章:

sql - 查询以获取前一周销售额排名最高的产品

javascript - 如何在另一个aspx页面中通过URL获取值

regex - 在 Oracle 中,如何选择包含特定数字范围内的字符的行?

oracle - 将 Oracle 旧外连接转换为 Ansi SQL

数据库算法缩放

performance - 尽管进行了 STOPKEY 优化,但前 N 个查询还是做了太多工作

Oracle 和分页

mysql - 重复输入错误,但存在欺骗

mysql - 有条件地将一个键链接到两个表

java - 未映射的 POJO 在 native 查询的结果异常中用作类类型