23对所有员工的薪水按照salary进行1-N的排名
Posted guoyu1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了23对所有员工的薪水按照salary进行1-N的排名相关的知识,希望对你有一定的参考价值。
1、题目描述
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
输入描述:
无
输出描述:
emp_no | salary | rank |
---|---|---|
10005 | 94692 | 1 |
10009 | 94409 | 2 |
10010 | 94409 | 2 |
10001 | 88958 | 3 |
10007 | 88070 | 4 |
10004 | 74057 | 5 |
10002 | 72527 | 6 |
10003 | 43311 | 7 |
10006 | 43311 | 7 |
10011 | 25828 | 8 |
2、代码:这道题主要难点就是rank列如何生成,只有一个表,那就使用自关联,这样可以添加过滤条件,a.salary<=b.salary,从而用count(distinct b.salary),就可以生成排名了,其思想就是对每一个工资,求他的排名就是求有多少是小于等于它的值的工资即可,最后进行去重,因为排名是从1开始,因此边界条件要加上=。
select a.emp_no,a.salary,count(distinct b.salary) as rank from salaries a join salaries b on a.to_date=‘9999-01-01‘ and b.to_date=‘9999-01-01‘ and a.salary<=b.salary group by a.emp_no order by a.salary desc,a.emp_no asc;
链接:https://www.nowcoder.com/questionTerminal/b9068bfe5df74276bd015b9729eec4bf?f=discussion
来源:牛客网
本题的主要思想是复用salaries表进行比较排名,具体思路如下:
1、先对一张表的salary进行排序
1
2
3
4
5
6
7
|
select emp_no ,salary from salaries where to_date = ‘9999-01-01‘ order by salary desc; |
2、进行并列操作,加入 count
1
2
3
4
5
6
7
|
select emp_no ,salary,count(salary) from salaries where to_date = ‘9999-01-01‘ order by salary desc; |
3.这样只是统计了,这个salary出现的次数,并没有依照次序进行排序,要进行次序的排序,必须count,大于等于该条salary的数据条数,又因为数据有重复,所以distinct,此处必须使用表的重复使用功能
1
2
3
4
5
6
7
8
9
10
11
12
|
select a.emp_no ,a.salary, count(distinct b.salary) from salaries as a,salaries as b where a.to_date = ‘9999-01-01‘ and b.to_date = ‘9999-01-01‘ and a.salary<= b.salary order by salary desc; |
3、因为使用了合计函数导致,count只返回一个值,表a选择返回的值却有好几个,所以必须进行分组查询
1
2
3
4
5
6
7
8
9
10
11
12
13
|
select a.emp_no ,a.salary, count(distinct b.salary) from salaries as a,salaries as b where a.to_date = ‘9999-01-01‘ and b.to_date = ‘9999-01-01‘ and a.salary<= b.salary group by a.emp_no order by salary desc; |
4、最后在s1.salary 逆序排之后,再以 s1.emp_no 顺序排列输出结果,必须满足第一个条件的情况下,满足第二个排序条件,等于进行的是相同的rank,数据有重复的值进行了emp_no的排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
最终结果 select a.emp_no ,a.salary, count(distinct b.salary) from salaries as a,salaries as b where a.to_date = ‘9999-01-01‘ and b.to_date = ‘9999-01-01‘ and a.salary<= b.salary group by a.emp_no order by a.salary desc,a.emp_no asc; |
以上是关于23对所有员工的薪水按照salary进行1-N的排名的主要内容,如果未能解决你的问题,请参考以下文章
给出每个员工每年薪水涨幅超过5000的员工编号emp_no薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。
牛客网SQL-第8题-找出所有员工当前具体的薪水salary情况
牛客网SQL-第8题-找出所有员工当前具体的薪水salary情况
牛客网SQL-第8题-找出所有员工当前具体的薪水salary情况