题解 | #实习广场投递简历分析(三)# 及实际应用场景

实习广场投递简历分析(三)

http://www.nowcoder.com/practice/83f84aa5c32b4cf5a75558d02dd7743c

题目地址

https://www.nowcoder.com/practice/83f84aa5c32b4cf5a75558d02dd7743c?tpId=82&&tqId=37924&rp=1&ru=/activity/oj&qru=/ta/sql/question-ranking

题目简述

给了一张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

全部评论

相关推荐

12-01 18:27
已编辑
湖南科技大学 后端工程师
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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