27

给出每个员工每年薪水涨幅超过5000的员工编号emp_no

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

题目:汇给出每个员工每年薪水涨幅超过5000的员工编号emp_no,薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。
提示:在sqlite中获取datetime时间对应的年份函数为strftime(‘%Y’, to_date)

方法:
SELECT s1.emp_no, s2.from_date, (s2.salary - s1.salary) AS salary_growth
FROM salaries AS s1, salaries AS s2
WHERE s1.emp_no=s2.emp_no
AND (STRFTIME('%Y', s2.from_date) - STRFTIME('%Y', s1.from_date) = 1
OR STRFTIME('%Y', s2.to_date) - STRFTIME('%Y', s1.to_date) = 1)
AND salary_growth>5000
ORDER BY salary_growth DESC;
注意:因为要的是薪水变更开始日期,所以是s2.from_date。
补充:虽然只用STRFTIME('%Y', s2.to_date) - STRFTIME('%Y', s1.to_date) = 1就能通过题库测试,但是按照上面的写法更保险
补充:在sqlite中截取年份的函数是strftime,而在mysql中则是DATE_FORMAT(to_date, '%Y'):
SELECT s1.emp_no, s2.from_date, (s2.salary - s1.salary) AS salary_growth
FROM salaries AS s1, salaries AS s2
WHERE s1.emp_no=s2.emp_no
AND (DATE_FORMAT(s2.from_date, '%Y')-DATE_FORMAT(s1.from_date, '%Y')=1
OR DATE_FORMAT(s2.to_date, '%Y')-DATE_FORMAT(s1.to_date, '%Y')=1)
AND s2.salary-s1.salary>5000
ORDER BY salary_growth DESC;
注意:在mysql中,WHERE查询中的s2.salary-s1.salary不能改成salary_growth

想说一下这题出的确实不好:
因为存在这样的记录:
+--------+--------+------------+------------+
| emp_no | salary | from_date | to_date |
+--------+--------+------------+------------+
| 10008 | 46671 | 1998-03-11 | 1999-03-11 |
| 10008 | 48584 | 1999-03-11 | 2000-03-10 |
| 10008 | 52668 | 2000-03-10 | 2000-07-31 |
经过筛选| 10008 | 46671 | 1998-03-11 | 1999-03-11 |和| 10008 | 52668 | 2000-03-10 | 2000-07-31 |(to_date差1年)
会认为这次涨幅超过5000(52668-46671)。但实际上看上去这就不是差了1年。(当然要通过题库,这一条数据也是必须查录的)。所以觉得这题不太好。

全部评论
题目中给的条件是每条记录的时间间隔是一年,所以应该不会出现你说的那个查询时间不到一年的记录
点赞 回复 分享
发布于 2020-10-23 18:34
求问为何我用(STRFTIME('%Y', s2.from_date) = STRFTIME('%Y', s1.from_date) +1)表示一年就出不了结果。这个和STRFTIME('%Y', s2.from_date) - STRFTIME('%Y', s1.from_date) = 1的区别在哪??
点赞 回复 分享
发布于 2020-08-11 15:54
你好,感谢你的分享,但我觉得这个写法不对,在where 里面那个salary_growth > 5000这样设置逻辑不符合题目描述,我理解的是如果这个员工要被选出来,那么他每年的涨幅都要大于5000,你这个写法的话,会把某些有的年份涨幅大于5000 但有的年份涨幅又不满足5000的员工也筛选出来,我认为应该用not in/exist (子查询),这里的子查询查询是只要存在某年薪水涨幅小于5000的记录的员工就被选出来
点赞 回复 分享
发布于 2020-05-29 03:05

相关推荐

缒梦&独舞:这家公司是这样的,去年给我实习offer了,不过也是面着玩儿的,他周六还要去做公益志愿活动
点赞 评论 收藏
分享
评论
9
收藏
分享

创作者周榜

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