题目描述

我们有一个表:

  • resume_info:包含简历投递信息,包括记录ID id、岗位名称 job、投递日期 date 和投递数量 num

目标是查询出在2025年和2026年每个月每个岗位收到的简历数量,并将2025年和2026年同一个月的同一岗位的简历数量进行对比。结果需要按2025年的月份降序排列,然后按岗位名称降序排列。

知识点

  • 日期函数:使用YEAR函数提取日期中的年份,使用DATE_FORMAT函数格式化日期为YYYY-MM格式。
  • 聚合函数:使用SUM函数计算每个月每个岗位的简历投递总数。
  • 分组:使用GROUP BY子句按月份和岗位分组。
  • 连接操作:使用JOIN连接2025年和2026年的数据。
  • 排序:使用ORDER BY子句按月份和岗位名称降序排列结果。

关键问题分析

1. 提取2025年每个月每个岗位的简历数量

我们使用DATE_FORMAT函数格式化日期为YYYY-MM格式,并使用SUM函数计算每个月每个岗位的简历投递总数:

select
    job, date_format(date, "%Y-%m") as first_year_mon,
    sum(num) as first_year_cnt
from resume_info
where year(date) = 2025
group by job, first_year_mon
  • DATE_FORMAT(date, "%Y-%m") AS first_year_mon: 格式化日期为YYYY-MM格式。
  • SUM(num) AS first_year_cnt: 计算每个月每个岗位的简历投递总数。
  • GROUP BY job, first_year_mon: 按月份和岗位分组计算投递总数。

2. 提取2026年每个月每个岗位的简历数量

类似地,我们提取2026年每个月每个岗位的简历数量:

select
    job, date_format(date, "%Y-%m") as second_year_mon,
    sum(num) as second_year_cnt
from resume_info
where year(date) = 2026
group by job, second_year_mon

3. 连接2025年和2026年的数据

我们使用JOIN连接2025年和2026年的数据,确保同一个月的同一岗位进行对比:

on right(r1.first_year_mon, 2) = right(r2.second_year_mon, 2) and r1.job = r2.job
  • RIGHT(r1.first_year_mon, 2) = RIGHT(r2.second_year_mon, 2): 确保月份相同。
  • r1.job = r2.job: 确保岗位相同。

4. 排序输出

我们按2025年的月份降序排列,然后按岗位名称降序排列输出结果:

order by r1.first_year_mon desc, r1.job desc

完整代码

select r1.job, r1.first_year_mon, r1.first_year_cnt, r2.second_year_mon, r2.second_year_cnt
from (
    select
        job, date_format(date, "%Y-%m") as first_year_mon,
        sum(num) as first_year_cnt
    from resume_info
    where year(date) = 2025
    group by job, first_year_mon
) r1
join (
    select
        job, date_format(date, "%Y-%m") as second_year_mon,
        sum(num) as second_year_cnt
    from resume_info
    where year(date) = 2026
    group by job, second_year_mon
) r2 on right(r1.first_year_mon, 2) = right(r2.second_year_mon, 2) and r1.job = r2.job
order by r1.first_year_mon desc, r1.job desc;