作者:老表-简说Python
题目来源:https://www.nowcoder.com/ta/sql
SQL7 查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t
我的思路: 在薪水表中根据员工编号分组,然后计算每个组内的数据条数,筛选出数据条数大于15的员工编号和对应的数据条数即可。
我的题解:
select emp_no, count(emp_no) as t from salaries group by emp_no having count(emp_no) > 15;
涉及知识点:
- 聚合函数count()计数
- 完整sql执行顺序(每天看一遍,不信记不住):
from -> where -> group by -> having -> select -> order by -> limit
- group by 分组,having配合分组后筛选
提交结果:
其他题解学习:
在这题的讨论里看到这样一条讨论,然后看了下这个讨论下的评论,大家讨论的点是这题想统计的员工薪资涨幅次数大于15次的数据,而不是薪资表中有15条以上记录的员工数据。
估计这题原本是统计salaries
表中员工薪水涨幅次数大于15次的员工编号和涨幅次数,那我们顺着这个思维来思考下吧。
思路: 首先涨幅肯定是想统计正涨幅,即按时间相邻两次薪水差为正值,然后统计涨幅超过15次的员工编号
理论上感觉不存在,一般调薪少则一个季度一次,多则一年一次,能调薪15次以上,应该是元老级别了!所以这样一想,可能原本出题者就是想考下大家group by having,统计下薪水发放次数。
当然,既然遇到这种思维,我们就顺着去练一练。
本题其他题解来自讨论区的LeronTalks
。
select tmp.emp_no, count(tmp.whether) as t from ( select emp_no, ifnull(s1.salary > (select salary from salaries as s2 where s1.from_date > s2.from_date and s1.emp_no = s2.emp_no order by s2.from_date desc limit 1), 1) as whether from salaries as s1) as tmp group by tmp.emp_no having count(tmp.whether) > 15;
另外还有几个新增知识点:
- 控制流函数ifnull(a,b),如果a为null或者0,则ifnull的值就为b,否则就为a;
- count(null)为0;
这个评论很到位,学习、工作、生活中我们都应该多思考,而不是把自己困在既有的条条框框下,加油!