SQL - 显示每个部门的第二高工资,如果员工具有相同的工资,则显示最低工资的工资

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL - 显示每个部门的第二高工资,如果员工具有相同的工资,则显示最低工资的工资相关的知识,希望对你有一定的参考价值。

我需要为每个部门显示第二高薪,如果员工的工资相同,那么显示薪水最少empno

我有emp表如下,其中deptno 20有两个empno 7788和7902的第二高薪3000。

EMPNO   ENAME   JOB  SAL    DEPTNO
7698    BLAKE   MANAGER  2850   30
7844    TURNER  SALESMAN 1500   30
7499    ALLEN   SALESMAN 1600   30
7654    MARTIN  SALESMAN 1250   30
7521    WARD    SALESMAN 1250   30
7900    JAMES   CLERK    950    30
7788    SCOTT   ANALYST  3000   20
7566    JONES   MANAGER  2975   20
7369    SMITH   CLERK    25000  20
7876    ADAMS   CLERK    1100   20
7902    FORD    ANALYST  3000   20
7839    KING    PRESIDENT 5000  10
7934    MILLER  CLERK    1300   10
7782    CLARK   MANAGER  2450   10

我写了下面的代码:

select * from (
  select e.*, row_number() over (partition by deptno order by sal desc ) rn 
  from emp e  
)where rn = 2;

我得到了以下结果。但根据我的要求,如果任何员工在该部门工资相同,那么应该显示员工编号最少的工资,但在我的情况下会显示empno 7902。但我需要用empno 7788显示薪水:

EMPNO   ENAME   JOB       SAL   DEPTNO
7782    CLARK   MANAGER   2450  10
7902    FORD    ANALYST   3000  20
7499    ALLEN   SALESMAN  1600  30

怎么做到这一点?

答案

此查询在mysql上提供正确的结果

select * from (
    select e.*, row_number() over (partition by deptno order by sal desc, empno asc ) rn 
    from emp e  
) s where rn = 2;

结果

EMPNO   ENAME   JOB         SAL     DEPTNO  rn  
7782    CLARK   MANAGER     2450    10      2  
7788    SCOTT   ANALYST     3000    20      2   
7499    ALLEN   SALESMAN    1600    30      2

dbfiddle using Oracle

另一答案

试试这个..

你必须在asc的order by子句中添加empno

    select * from ( select e.*, row_number() over (partition by deptno order by 
    sal desc,empno asc ) rn 
    from emp e) where rn = 2;
另一答案

你可以使用RANK()RANK()ROW_NUMBER()之间的区别在于RANK()将为相同的数字提供相同的排名,因此您将看到20个部门的2。然后用另一个ROW_NUMBER()来包装它以获取最少的EMPNO:

SELECT * FROM (
SELECT
  subq.EMPNO,
  subq.DEPTNO,
  ROW_NUMBER() OVER(PARTITION BY subq.DEPTNO ORDER BY EMPNO ASC) AS empno_rownum
FROM (  
  SELECT 
    salary.EMPNO,
    salary.DEPTNO,
    RANK() OVER(PARTITION BY salary.DEPTNO ORDER BY salary.SAL DESC) AS salary_rank
  FROM salary
) AS subq
WHERE subq.salary_rank = 2
) AS subq2
WHERE subq2.empno_rownum = 1

这是结果:

EMPNO   DEPTNO  salary_rank
7782    10  2
7788    20  2
7499    30  2

以上是关于SQL - 显示每个部门的第二高工资,如果员工具有相同的工资,则显示最低工资的工资的主要内容,如果未能解决你的问题,请参考以下文章

mysql常见面试题

写下SQL显示员工(工资大于5000)平均工资小于8000的部门

查询同部门某个员工信息SQL语句

sql查询员工的基本工资排名第3-6位的姓名和基本工资

SQL 窗口函数在订单级别查找每个客户的第二高订单日期

查询各个部门中各职位的人数与平均工资? 查询工资,奖金与10号部门某员工工资,奖金都相同的员工? SQL