2010-03-22 46 views
4

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

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 

,您可以使用分析:

回答

0

试试这个:

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

-1我不确定这会返回什么,但可能不是什么问题是关于:-) – 2010-03-22 09:53:17

+0

这取决于他的意思是“方法”。 对我来说,一个方法是一个获得结果的过程;这是我建议的方法。感谢我的第一次downvote :)。 – systempuntoout 2010-03-22 09:57:08

+3

@Aaron:或许不是最有效的方法来返回结果(因为它使用自联接),但它会返回正确的答案,*提供的薪水是唯一的*(如果有三个人,它将不起作用与最高工资相同)。 – 2010-03-22 10:10:08

2

在Oracle中你可以使用一个查询,如这一个分页的结果返回(行M到N):

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

要做到这一点的方法是使用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()函数,它将返回按工资排序的第二名员工:如果有两名员工为最高工资绑定,该怎么办?如果有两名员工争取第二高的薪水呢? Wheareas如果使用RANK(),并有两名员工为搭售第一薪水最高,将会有没有记录与RANK = 2

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

1

如果你想找到从表中N个最高的工资,你可以使用这个:

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

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

这是一个非常容易的过程,从表中找出最高工资。

相关问题