题解 | #获取每个部门中当前员工薪水最高的相关信息#

获取每个部门中当前员工薪水最高的相关信息

http://www.nowcoder.com/practice/4a052e3e1df5435880d4353eb18a91c6

解法一 纯 JOIN

select t.dept_no, j.emp_no, t.maxSalary from
(
select d.dept_no as dept_no, max(s.salary) as maxSalary
from dept_emp d join salaries s on s.emp_no = d.emp_no group by d.dept_no
) as t
inner join
(
select d.dept_no as dept_no, s.salary as salary, d.emp_no as emp_no
from dept_emp d join salaries s on s.emp_no = d.emp_no
) as j
on
j.dept_no = t.dept_no and j.salary = t.maxSalary
order by t.dept_no asc;

通过全部用例
运行时间 60ms
占用内存 6904KB

代码长而不难,比较容易理解。

第一个子查询先聚合,group by 聚合键 和 聚合函数 求出每个部门和它的最高薪水,问题在于没有emp_no,接下来我们补充这个字段。

第二个子查询 join 两张表,得到一张宽表,通过dept_no和salary定位到emp_no。

最后按照部门升序。

解法二


select t.dept_no, s.emp_no, t.maxSalary from 
(
select d.dept_no, max(s.salary) as maxSalary from dept_emp d,salaries s
where d.emp_no = s.emp_no group by d.dept_no
) as t, salaries s, dept_emp d
where 
t.maxSalary = s.salary
and t.dept_no = d.dept_no
and d.emp_no = s.emp_no
order by t.dept_no asc

在子查询里面找到 dept_no 和 maxSalary,外部用 where 条件限定,最后按照部门排序。


解法三 利用 MYSQL 8.0 之后的开窗函数


select dept_no, emp_no, maxSalary from
(
select d.dept_no as dept_no,d.emp_no as emp_no,s.salary as salary,
first_value(salary) over(partition by d.dept_no order by s.salary desc) as maxSalary
from dept_emp d join salaries s on s.emp_no = d.emp_no 
) as t where salary = maxSalary

通过全部用例 
运行时间 52ms 
占用内存 6776KB

按照部门分区,再按照薪水倒序排序,取第一条就是最大薪资
first_value(salary) over(partition by d.dept_no order by s.salary desc) as maxSalary
结果还不是我们想要的,每一行记录都会与聚合值拼接成一行,需要再次把  salary 等于最大薪资  maxSalary 的筛选出来
where salary = maxSalary

利用 rank() :
select dept_no, emp_no,salary as maxSalary from
(
select d.dept_no as dept_no, d.emp_no as emp_no, s.salary as salary,
rank() over(partition by d.dept_no order by s.salary desc) as ranking
from dept_emp d join salaries s on s.emp_no = d.emp_no 
) as t where t.ranking = 1;





全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 14:45
bg是二本双一流硕,目标是Java后端开发岗,投暑期实习0大厂面试,只有极少的大厂测开,可能投的晚加上简历太烂加上0实习?求大佬们给个建议
程序员小白条:别去小厂,初创或者外包,尽量去中小,100-499和500-999,专门做互联网产品的,有公司自研的平台和封装的工具等等,去学习一些业务相关的,比如抽奖,积分兑换,SSO认证,风控,零售等等,目标 Java 后端开发吗?你要不考虑直接走大厂测开?如果技术不行的话,有面试你也很难过的
实习,不懂就问
点赞 评论 收藏
分享
昨天 10:44
青岛工学院 Java
机械打工仔:对方没做错任何事,你自己在这自找没趣呢,就算他工资不高,人家定多少薪资是人家的事,况且人家写了1~3年清清楚楚
点赞 评论 收藏
分享
zhch7:建议9✌️把学历加黑加粗,如果实在offer可能是觉得佬不会去
投了多少份简历才上岸
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务