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

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

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

全部评论
不是吧,你这个什么情况?
1 回复 分享
发布于 2021-04-08 11:57
请问 group by s1.emp_no 在这里起什么作用呢
1 回复 分享
发布于 2021-04-15 16:05
我也用了类似的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
你这瞎猫撞上死耗子吧,他这个就是用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
兄弟 你说句话吖!
点赞 回复 分享
发布于 2021-08-06 14:58
研究了一下 观察表结构,emp_no是主键1,from_date是主键2,mysql会默认根据主键优先级从低到高排序。 没加聚合主键时取第一条数据也是按这个顺序取的,所以如果from_date变一下比如:2001那个改为2003答案就错了
点赞 回复 分享
发布于 2021-08-06 15:17
确实是妙,也是取巧的一种。有些group by之后能取出的字段很严格,这是 s2.salary-s1.salary 不一定能取。
点赞 回复 分享
发布于 2021-08-09 12:41
为什么我的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筛选完之后的结果就一定是from_date最早的。翻了好久代码才发现,from_date也是主键。自连接+用to_date='9999-01-01'进行where操作后的结果集,应该是按照两个主键进行了排序,这就保证了结果集的顺序是以from_date降序进行排列的。而group by分组如果是一对多的关系,那存在多个结果的字段,保留下来的数据一定是最靠前的那一条,最后自然而然留下来的就是题目想要的结果了。其实可以这么玩的关键其实在于,from_date是主键。我很怀疑如果from_date如果不是主键,这个玩法就失效了。
点赞 回复 分享
发布于 2021-10-12 15:01
“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
写的不是很理解,兄弟这是什么思路?
点赞 回复 分享
发布于 2022-02-09 15:04
我用你这个报错了
点赞 回复 分享
发布于 2022-05-06 13:13
我用你这个报错了
点赞 回复 分享
发布于 2022-05-28 00:21
这种写法不建议学,新版sql直接报错
点赞 回复 分享
发布于 2022-09-12 09:24 上海
感觉很奇怪,有个问题就是假如有员工的to_date不等于9999-01-01但是工资有涨幅,那是不是在这有bug呢。。。
点赞 回复 分享
发布于 2022-12-21 22:40 新疆
看看这个解法 https://www.nowcoder.com/discuss/572441130474733568?sourceSSR=users
点赞 回复 分享
发布于 01-05 15:54 河北
这个会报错,因为mysql里面select 后只能跟常数、group by 中引用的字段、聚合函数
点赞 回复 分享
发布于 07-25 10:57 广东
这个绝对是错的,能通过是因为每个员工工资增幅为一次,要是多次怎么办?
点赞 回复 分享
发布于 09-15 09:33 北京

相关推荐

10-05 11:11
海南大学 Java
投票
理想江南137:感觉挺真诚的 感觉可以试一试
点赞 评论 收藏
分享
评论
47
3
分享
牛客网
牛客企业服务