题解 | #获取当前薪水第二多的员工的emp_no以及其对应的薪水salary#

获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

http://www.nowcoder.com/practice/c1472daba75d4635b7f8540b837cc719

【限制】不能使用order by完成意味着不能使用dense_rank()窗口函数以及order by + limit组合筛选
【最终代码】在上述限制下只能使用左连接+子查询
select s.emp_no, s.salary, e.last_name, e.first_name from salaries as s left join employees as e on s.emp_no = e.emp_no where s.salary = (select max(salary) from salaries where salary < (select max(salary) from salaries))

【总结】:获取薪水第几高的员工信息这类题目一共有4种类型的方法
【1】使用dense_rank()获取一个包含排名以及各项信息的临时表并对临时表命名,再用where 进行子查询,筛选dense_rank()等于某个数的员工信息(dense_rank()函数会用到order by)
【2】使用order by对薪水进行排序(考虑可能存在多个员工薪水相同时使用distinct再进行排序),后用limit m,n 选出第几高的薪水,最后用where子查询找出原表中薪水等于前面筛选出的薪水的员工信息。
【3】首先在包含薪水信息的表中用where进行子查询:如select max(salary) from salaries where salary < (select max(salary) from salaries)得到第几高的薪水值,其次链接多个表获得包含薪水与员工信息的一个总表,在总表中进行子查询where 薪水等于第一步查询得到的薪水。
【4】在讨论区学到的方法,自己最开始没有想到,而且这个方法效率更高
select s.emp_no, s.salary, e.last_name, e.first_name
from salaries as s left join employees as e
on s.emp_no = e.emp_no
where s.salary =
(
select s1.salary
from salaries s1 join salaries s2 -- 自连接查询
on s1.salary <= s2.salary
group by s1.salary -- 当s1<=s2链接并以s1.salary分组时一个s1会对应多个s2
having count(distinct s2.salary) = 2 -- (去重之后的数量就是对应的名次)
)

全部评论

相关推荐

牛客410815733号:这是什么电影查看图片
点赞 评论 收藏
分享
11-14 17:28
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务