作者:老表-简说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;

这个评论很到位,学习、工作、生活中我们都应该多思考,而不是把自己困在既有的条条框框下,加油!