题解 | #实习广场投递简历分析(三)# 及实际应用场景
实习广场投递简历分析(三)
http://www.nowcoder.com/practice/83f84aa5c32b4cf5a75558d02dd7743c
题目地址
题目简述
给了一张resume_info的表
要求:
请你写出SQL语句查询在2025年投递简历的每个岗位,每一个月内收到简历的数目,和对应的2026年的同一个月同岗位,收到简历的数目,最后的结果先按first_year_mon月份降序,再按job降序排序显示,以上例子查询结果如下:
题目拆解
首先要知道考点,这道题主要考察字符串的处理。
附加知识点是,①order by的处理顺序;②表自连接。
处理字符串的常见函数有,substring(),left(),right(),date_format()
因为date是日期型数据处理,我想到使用date_format(合法日期数据,"%Y-%m"),也可以用substring(date,1,7)。但进一步想,如果题目要求不是"2025-02"的形式,而是"202502"或"2025/02"等形式,date_format只需要改后面的format参数即可,灵活度更高。
另外,因为需要一张含2025年去连接含2026年的表,我使用了with as先聚合出一张小表,提高代码可读性。(网上常说Mysql不能用with as,现在的版本是可以用的)
with as部分代码如下:
with t1 as(
SELECT job
,date_format(date,"%Y-%m") tag #制作最后呈现的年月字符串
,year(date) year # 提取年份
,month(date) mon # 提取月份
,SUM(num) AS num
FROM resume_info
GROUP BY job,year,mon)下一步就很简单了,做个inner join自连接
关联的时候,year = year +1,month = month,再筛选year = 2025
再按照month和job降序排序即可
下面是完整代码:
with t1 as( SELECT job, date_format(date,"%Y-%m") tag, year(date) year,month(date) mon,SUM(num) AS num FROM resume_info GROUP BY job,year,mon ) SELECT a.job ,a.tag first_year_mon ,a.num first_year_cnt ,b.tag first_year_mon ,b.num first_year_cnt FROM t1 a JOIN t1 b ON a.job = b.job AND b.year = a.year +1 AND a.mon = b.mon WHERE a.year = 2025 ORDER BY a.mon desc,job desc
多思考一步
我一直认为做题需要学会举一反三,比如这道题目的代码,在实际工作中是不是有应用场景。
假设题目改为,每一年及其下一年的同岗位同月份数据配比,这里就不需要where条件。平时做同本期对比,就可以考虑用这套方法啦。
参考文章
with as的用法参考一篇博客:https://blog.csdn.net/Abysscarry/article/details/81322669
