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
另一答案
试试这个..
你必须在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 - 显示每个部门的第二高工资,如果员工具有相同的工资,则显示最低工资的工资的主要内容,如果未能解决你的问题,请参考以下文章