获取当前工资第二多的员工(不用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
说都说反了 应该是薪水大于自己的不重复个数
2 回复 分享
发布于 2021-05-01 18:18
这个思路挺好的,相当于先做排名,再取第几位,泛用性比套两个MAX()好。但是子查询里用group by,select行就不能有s1.emp_no字段了吧,非聚合字段也不是聚合函数,这会报错吧?
点赞 回复 分享
发布于 2021-08-12 17:59
想问一下,为啥cnt要等于2呢😂
点赞 回复 分享
发布于 2021-08-03 17:07
你这个解法才是最好理解的,那些高赞的都不太容易理解
点赞 回复 分享
发布于 2021-01-16 19:11
"employees中没有to_date字段",真是一语惊醒不仔细看题的我。。。改过来马上正确了,谢谢提醒~
点赞 回复 分享
发布于 2020-10-19 15:29

相关推荐

白火同学:1、简历可以浓缩成一页,简历简历先要“简”方便HR快速过滤出有效信息,再要“历”用有效信息突出个人的含金量。 2、教育背景少了入学时间~毕业时间,HR判断不出你是否为应届生。 3、如果你的平台账号效果还不错,可以把账号超链接或者用户名贴到对应位置,一是方便HR知道你是具体做了什么内容的运营,看到账号一目了然,二是口说无凭,账号为证,这更有说服力。
面试被问期望薪资时该如何...
点赞 评论 收藏
分享
评论
16
4
分享

创作者周榜

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