How to find the employee with the second highest salary?

早过忘川 提交于 2019-11-26 14:48:12

问题


Is there any predefined function or method available to get the second highest salary from an employee table?


回答1:


The way to do this is with Oracle's Analytic functions. Your particular scenario is just a variant on the solution I provided in another thread.

If you are interested in just selecting the second highest salary then any of DENSE_RANK(), RANK() and ROW_NUMBER() will do the trick:

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> 

However, if you want to select additional information, such as the name of the employee with the second highest salary, the function you choose will affect the result. The main reason for choosing one over another is what happens when there is a tie.

If you use ROW_NUMBER() it will return the second employee ordered by salary: what if there are two employees tying for the highest salary? What if there are two employees tying for the second highest salary? Wheareas if you use RANK() and there are two employees tying for first highest salary, there will be no records with RANK = 2.

I suggest DENSE_RANK() is the usually the safest function to choose in these cases, but it really does depend on the specific business requirement.




回答2:


In Oracle you would use a query such as this one to return paged results (rows M to 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

Alternatively, you can use analytics:

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



回答3:


If you want to find the n highest salaries from the table, you can use this:

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

where n is 1,2,3, ..., n

It is a very easy process to find out the max salary from the table.




回答4:


Try this:

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



回答5:


It's easier handling Top-N queries with Oracle DB 12c which introduced such a syntax :

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

to be used in a query after ORDER BY list.

In this case consider using :

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

where using offset is optional, as already seen from the syntax, and points out the starting point for the fetch clause will be offset + 1.

A special case is having ties which means multiple rows match the value of the Nth row(here we need 2nd row). If there are more than one people with the same salary for the top-second position, then we need to replace only keyword by with ties to return them all :

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

Demo



来源:https://stackoverflow.com/questions/2491063/how-to-find-the-employee-with-the-second-highest-salary

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!