题解 | #实习广场投递简历分析(三)#
实习广场投递简历分析(三)
http://www.nowcoder.com/practice/83f84aa5c32b4cf5a75558d02dd7743c
看到这个题目的时候,第一反应就是要使用表连接,假设需要连接的两表为表a和表b。表a是将2025年按课程和月份分类汇总的简历数据,表b是将2026年按课程和月份分类汇总的简历数据。其中的关键是选择哪一字段为连接条件,这里我想了两个思路,供大家参考:
1、使用窗口函数
(select job,left(date,7) fy,sum(num) cnt,
row_number()over(order by left(date,7) desc,job desc) rk1
from resume_info
where Year(date) = '2025'
group by job,fy) a join
(select job,left(date,7) sy,sum(num) cnt,
row_number()over(order by left(date,7) desc,job desc) rk2
from resume_info
where Year(date) = '2026'
group by job,sy) b
on (a.job = b.job
and a.rk1= b.rk2)
order by a.fy desc,a.job DESC
大致思路是先找出工作类别、年-月份、分类汇总的简历数量以及按年-月份和职位进行排序的字段rk1,其中采用的排序函数为row_number()over(),即顺序排位,并将rk1作为之后表连接的条件字段。以同样的思路设置表b,并将表b中的rk2作为表连接的条件字段。
注意:采用此方法的前提是2025以及2026年的月份信息是一致的,这样才能确保rk1与rk2连接起来后是对应的相同的月份。
2、按工作类型和年-月份信息进行连接
(select job,left(date,7) fy,sum(num) cnt
from resume_info
where Year(date) = '2025'
group by job,fy) a join
(select job,left(date,7) sy,left(DATE_ADD(date,interval -1 year),7) fy,sum(num) cnt
from resume_info
where Year(date) = '2026'
group by job,sy,fy) b
on (a.job = b.job
and a.fy= b.fy)
order by a.fy desc,a.job DESC
这一思路用的较多,准确性也更高,其中的关键就是将年月份信息提取出来,此处我采用的是left函数。用法为left(str,n),即获取字符串str的前n个字符。在设置连接字段时,表a中的job和年月份信息都是已经拿到的,表b也获取了job字段,关键是如何设置表b中的年-月份字段,此处我采用的是date_add()函数,先将表b中的年-月份数据减掉一年,得到的年月份信息就与表a中的年月份信息保持了一致,在使用表连接时通过job字段和年月份字段同时使用就可以起到唯一识别的作用。