如何找到薪水第二高的员工?

时间:2010-03-22 09:31:24

标签: sql oracle top-n

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

5 个答案:

答案 0 :(得分:5)

这样做的方法是使用Oracle的Analytic函数。您的特定情况只是我在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(),它将返回按工资排序的第二名员工:如果有两名员工争夺最高薪水怎么办?如果有两名员工争夺第二高薪怎么办? Wheareas如果您使用RANK()并且有两名员工争夺第一个最高薪水,那么RANK = 2将会有 no 记录。

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

答案 1 :(得分:2)

在Oracle中,您将使用此类查询返回分页结果(行M到N):

SELECT NAME, salary
  FROM (SELECT NAME, salary, ROWNUM r 
          FROM (SELECT NAME, salary 
                  FROM employee 
                 ORDER BY salary DESC
                )
         WHERE ROWNUM <= :N
        )
 WHERE r >= :M

或者,您可以使用分析:

SELECT NAME, salary
  FROM (SELECT NAME, salary, row_number() over (ORDER BY salary DESC) n 
          FROM employee)
 WHERE n BETWEEN :M AND :N

答案 2 :(得分:1)

如果您想从表中找到n个最高工资,可以使用:

select min(sal)from (select distinct sal from emp order by sal desc) where rownum<=n;

其中n是1,2,3,...,n

从表格中找出最高工资是一个非常简单的过程。

答案 3 :(得分:0)

试试这个:

SELECT * FROM employee emp WHERE 2=(SELECT COUNT(*) FROM employee WHERE
salary >= emp.salary);

答案 4 :(得分:0)

使用Top-N处理Oracle DB 12c查询会更容易,该查询引入了这样的语法:

[ OFFSET offset { ROW | ROWS } ]
[ FETCH { FIRST | NEXT } [ { rowcount | percent PERCENT } ]
    { ROW | ROWS } { ONLY | WITH TIES } ]

ORDER BY列表之后的查询中使用。

在这种情况下,请考虑使用:

select *
  from emp
 order by sal desc
offset 1 rows fetch next 1 rows only

从语法上可以看出,在offset中使用fetch是可选的,并指出offset + 1子句的起点是ties

一种特殊情况是使用only,这意味着多行与第N行的值匹配(这里我们需要第2行)。如果排名第一的职位有不只一个薪水相同的人,那么我们需要将with ties替换为select * from emp order by sal desc offset 1 rows fetch next 1 rows with ties 关键字,以将他们全部退还:

add_edge

Demo