单表自连接就通过了。。。

查找所有员工自入职以来的薪水涨幅情况

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

select s1.emp_no, s2.salary-s1.salary growth
from salaries s1
inner join salaries s2 on s1.emp_no = s2.emp_no
where s2.to_date='9999-01-01'
group by s1.emp_no
order by growth asc

全部评论
我也用了类似的self join解法,但是where选用了两个条件: where s2.to_date = '9999-01-01' and s1.from_date in(select hire_date from employees) Microsoft SQL和mysql应该都可以用这个解法,但是sqlite不行,差异也是够大的
1 回复 分享
发布于 2021-07-05 04:11
请问 group by s1.emp_no 在这里起什么作用呢
1 回复 分享
发布于 2021-04-15 16:05
不是吧,你这个什么情况?
1 回复 分享
发布于 2021-04-08 11:57
你这瞎猫撞上死耗子吧,他这个就是用to_date=9999-01-01的salary减去每一个salary得到一堆growth, 然后groupby自动取了每个emp_no的第一个growth。正好他这个题里面每个emp_no对应的所有薪水里面正好第一个是hire_date的薪水,所以才歪打正着蒙对了。但凡题目里salaries那张表里薪水是瞎拍的,他这做法100%错。
5 回复 分享
发布于 2021-04-26 12:18
很离谱,我乍一看以为是错的,结果测试了一下居然是对的。 我以为我在第二层,结果楼主在第五层。 解释:mysql 有一条特殊规则:group by 前面不加聚合函数的时候,会默认取出组内第一条。而在 inner join 时产生的中间结果,mysql 在进行排列组合时有一定顺序,经测试为对日期进行降序排列。在默认取出组内第一条的时候,取出了日期最小的一行,即我们要求的答案。
2 回复 分享
发布于 2021-06-25 20:08
可以用两个join:SELECT s1.emp_no,s1.salary-s2.salary AS growth FROM salaries s1 JOIN salaries s2 ON s1.emp_no=s2.emp_no JOIN employees e ON s2.from_date=e.hire_date AND s2.emp_no=e.emp_no WHERE s1.to_date='9999-01-01' ORDER BY growth
1 回复 分享
发布于 2022-06-05 16:52
这个绝对是错的,能通过是因为每个员工工资增幅为一次,要是多次怎么办?
点赞 回复 分享
发布于 2024-09-15 09:33 北京
这个会报错,因为mysql里面select 后只能跟常数、group by 中引用的字段、聚合函数
点赞 回复 分享
发布于 2024-07-25 10:57 广东
看看这个解法 https://www.nowcoder.com/discuss/572441130474733568?sourceSSR=users
点赞 回复 分享
发布于 2024-01-05 15:54 河北
感觉很奇怪,有个问题就是假如有员工的to_date不等于9999-01-01但是工资有涨幅,那是不是在这有bug呢。。。
点赞 回复 分享
发布于 2022-12-21 22:40 新疆
这种写法不建议学,新版sql直接报错
点赞 回复 分享
发布于 2022-09-12 09:24 上海
我用你这个报错了
点赞 回复 分享
发布于 2022-05-28 00:21
我用你这个报错了
点赞 回复 分享
发布于 2022-05-06 13:13
写的不是很理解,兄弟这是什么思路?
点赞 回复 分享
发布于 2022-02-09 15:04
“group by 前面不加聚合函数的时候,会默认取出组内第一条”,这种规则 mysql 5.7 及以上默认不支持,因为 在5.7版本中sql_mode=only_full_group_by,可以通过 SELECT @@GLOBAL.sql_mode; 或者 SELECT @@SESSION.sql_mode; 查看当前sql_mode 规则
点赞 回复 分享
发布于 2021-12-16 14:03
这个太妙了,比较难理解的是为什么group by筛选完之后的结果就一定是from_date最早的。翻了好久代码才发现,from_date也是主键。自连接+用to_date='9999-01-01'进行where操作后的结果集,应该是按照两个主键进行了排序,这就保证了结果集的顺序是以from_date降序进行排列的。而group by分组如果是一对多的关系,那存在多个结果的字段,保留下来的数据一定是最靠前的那一条,最后自然而然留下来的就是题目想要的结果了。其实可以这么玩的关键其实在于,from_date是主键。我很怀疑如果from_date如果不是主键,这个玩法就失效了。
点赞 回复 分享
发布于 2021-10-12 15:01
为什么我的mysql5.7 执行命令后是如下这个错误? Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'zhx_test.s2.salary' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
点赞 回复 分享
发布于 2021-09-25 02:53
确实是妙,也是取巧的一种。有些group by之后能取出的字段很严格,这是 s2.salary-s1.salary 不一定能取。
点赞 回复 分享
发布于 2021-08-09 12:41
研究了一下 观察表结构,emp_no是主键1,from_date是主键2,mysql会默认根据主键优先级从低到高排序。 没加聚合主键时取第一条数据也是按这个顺序取的,所以如果from_date变一下比如:2001那个改为2003答案就错了
点赞 回复 分享
发布于 2021-08-06 15:17
兄弟 你说句话吖!
点赞 回复 分享
发布于 2021-08-06 14:58

相关推荐

03-15 00:45
已编辑
中国科学院大学 Java
问的很简单都秒了,但是面试官没开摄像头,疑似kpi,无后续。--------------------3/14更新,3/12通知给了口头offer,3/13发了意向书,已拒。一面(35min)(25/3/6)(无后续)    1、自我介绍    2、介绍一下你的那个Python相关项目(本科毕设,web系统+算法模型提供部分接口)    3、Java面向对象有哪些特点呢?详细说一下。    4、介绍一下hashmap;为什么要把链表转换为红黑树呢?红黑树查找的时间复杂度?1.7和1.8的区别。    5、介绍一下concurrentHashmap。    6、synchronized锁和Lock锁有什么区别?    7、公平锁的一个底层是怎么实现的呢?    8、线程池的核心参数、拒绝策略、提交一个任务执行流程?    9、spring有哪些特点?(ioc/aop)    10、spring中对于循环依赖是怎么解决的?    11、MySQL和redis的区别?    12、MySQL的索引结构是什么?    13、MySQL的事务有哪些特性?怎么保证?    14、MySQL的默认隔离级别?可重复读是怎么做到的呢?    15、介绍一下MVCC和快照读readview。    16、一般在什么场景下会使用redis?    17、对于大量的请求,如果此时缓存中还没有写入数据怎么办?    18、介绍一下redis实现的分布式锁。    19、有用过es和mongo DB吗?(知道,没用过)    20、消息中间件用过吗?说一下你的使用场景?    21、一个场景,如果说有一个接口响应的比较慢,如果说让你排查,你会怎么去排查?(上下游接口、大key问题,只答了两,后面试官补充)    无手撕,反问业务。
胖墩墩的查理在学c语言:哥们我是五号面的 流程差不多
查看21道真题和解析
点赞 评论 收藏
分享
03-15 14:55
已编辑
门头沟学院 golang
bg:双非学院本 ACM银 go选手timeline:3.1号开始暑期投递3.7号第二家公司离职顽岩科技 ai服务中台方向 笔试➕两轮面试,二面挂(钱真的好多😭)厦门纳克希科技 搞AI的,一面OC猎豹移动 搞AIGC方向 一面OC北京七牛云 搞AI接口方向 一面OC上海古德猫宁 搞AIGC方向 二面OC上海简文 面试撞了直接拒深圳图灵 搞AIGC方向一面后无消息懒得问了,面试官当场反馈不错其他小厂没记,通过率80%,小厂杀手😂北京字节 具体业务不方便透露也是AIGC后端方向2.28约面 (不知道怎么捞的我,我也没在别的地方投过字节简历哇)3.6一面 一小时 半小时拷打简历(主要是AIGC部分)剩余半小时两个看代码猜结果(经典go问题)➕合并二叉树(秒a,但是造case造了10分钟哈哈)一天后约二面3.12 二面,让我挑简历上两个亮点说,主要说的docker容器生命周期管理和raft协议使用二分法优化新任leader上任后与follower同步时间。跟面试官有共鸣,面试官还问我docker底层cpu隔离原理和是否知道虚拟显存。之后一道easy算法,(o1空间解决 给定字符串含有{和}是否合法)秒a,之后进阶版如何用10台机加快构建,想五分钟后a出来。面试官以为45分钟面试时间,留了18分钟让我跟他随便聊,后面考了linux top和free的部分数据说什么意思(专业对口了只能说,但是当时没答很好)。因为当时手里有7牛云offer,跟面试官说能否快点面试,马上另外一家时间到了。10分钟后约hr面3.13,上午hr面,下午走完流程offer到手3.14腾讯技术运营约面,想直接拒😂感受: 因为有AIGC经验所以特别受AI初创公司青睐,AIGC后端感觉竞争很小(指今年),全是简历拷打,基本没有人问我八股(八股吟唱被打断.jpeg),学的东西比较广的同时也能纵向深挖学习,也运气比较好了哈哈可能出于性格原因,没有走主流Java路线,也没有去主动跟着课写项目,项目都是自己研究和写的哈哈
烤点老白薯:你根本不是典型学院本的那种人,贵了你这能力
查看7道真题和解析
点赞 评论 收藏
分享
评论
47
3
分享

创作者周榜

更多
牛客网
牛客企业服务