获取当前工资第二多的员工(不用order by)

获取当前薪水第二多的员工的emp_no以及其对应的薪水salary,不准使用order by

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

感觉我的想法和讨论里的不太一样,不过大同小异哈~
1、首先创建子查询,该子查询中包含emp_no,salary,cnt字段,其中cnt为表salaries与自己比较,薪水小于自己的不重复个数(count(distinct s2.salary));
2、用内连接将employees与子查询连接起来,where中条件为cnt = 2,及工资比自己高(包括自己)的有两人,考虑了工资重复的情况。

注意:不要惯性思维,employees中没有to_date字段,一开始添加了这个条件,一直找不到原因。
select s.emp_no,s.salary,e.last_name,e.first_name from (
    select s1.emp_no,s1.salary,count(distinct s2.salary) cnt from salaries s1
    inner join salaries s2 on s1.salary <= s2.salary
    where s1.to_date='9999-01-01' and s2.to_date='9999-01-01'
    group by s1.salary) s
inner join employees e on s.emp_no = e.emp_no
where s.cnt = 2


全部评论
不明白为什么你们都要去处理to_date字段,写了这么多我从来没管过这个字段
1 回复
分享
发布于 2021-02-09 16:38
说都说反了 应该是薪水大于自己的不重复个数
1 回复
分享
发布于 2021-05-01 18:18
滴滴
校招火热招聘中
官网直投
"employees中没有to_date字段",真是一语惊醒不仔细看题的我。。。改过来马上正确了,谢谢提醒~
点赞 回复
分享
发布于 2020-10-19 15:29
你这个解法才是最好理解的,那些高赞的都不太容易理解
点赞 回复
分享
发布于 2021-01-16 19:11
想问一下,为啥cnt要等于2呢😂
点赞 回复
分享
发布于 2021-08-03 17:07
这个思路挺好的,相当于先做排名,再取第几位,泛用性比套两个MAX()好。但是子查询里用group by,select行就不能有s1.emp_no字段了吧,非聚合字段也不是聚合函数,这会报错吧?
点赞 回复
分享
发布于 2021-08-12 17:59

相关推荐

头像
不愿透露姓名的神秘牛友
昨天 12:10
点赞 评论 收藏
转发
点赞 评论 收藏
转发
15 4 评论
分享
牛客网
牛客企业服务