首页 > 试题广场 > 实习广场投递简历分析(三)
[编程题]实习广场投递简历分析(三)
  • 热度指数:35488 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
在牛客实习广场有很多公司开放职位给同学们投递,同学投递完就会把简历信息存到数据库里。
现在有简历信息表(resume_info),部分信息简况如下:

第1行表示,在2025年1月2号,C++岗位收到了53封简历
。。。
最后1行表示,在2027年2月6号,C++岗位收到了231封简历

请你写出SQL语句查询在2025年投递简历的每个岗位,每一个月内收到简历的数目,和对应的2026年的同一个月同岗位收到简历的数目,最后的结果先按first_year_mon月份降序,再按job降序排序显示,以上例子查询结果如下:

解析:
第1行表示Python岗位在2025年2月收到了93份简历,在对应的2026年2月收到了846份简历
。。。
最后1行表示C++岗位在2025年1月收到了107份简历,在对应的2026年1月收到了470份简历
示例1

输入

drop table if exists resume_info;
CREATE TABLE resume_info (
id int(4) NOT NULL,
job varchar(64) NOT NULL,
date date NOT NULL,
num int(11) NOT NULL,
PRIMARY KEY (id));

INSERT INTO resume_info VALUES
(1,'C++','2025-01-02',53),
(2,'Python','2025-01-02',23),
(3,'Java','2025-01-02',12),
(4,'C++','2025-01-03',54),
(5,'Python','2025-01-03',43),
(6,'Java','2025-01-03',41),
(7,'Java','2025-02-03',24),
(8,'C++','2025-02-03',23),
(9,'Python','2025-02-03',34),
(10,'Java','2025-02-04',42),
(11,'C++','2025-02-04',45),
(12,'Python','2025-02-04',59),
(13,'C++','2026-01-04',230),
(14,'Java','2026-01-04',764),
(15,'Python','2026-01-04',644),
(16,'C++','2026-01-06',240),
(17,'Java','2026-01-06',714),
(18,'Python','2026-01-06',624),
(19,'C++','2026-02-14',260),
(20,'Java','2026-02-14',721),
(21,'Python','2026-02-14',321),
(22,'C++','2026-02-24',134),
(23,'Java','2026-02-24',928),
(24,'Python','2026-02-24',525),
(25,'C++','2027-02-06',231);

输出

Python|2025-02|93|2026-02|846
Java|2025-02|66|2026-02|1649
C++|2025-02|68|2026-02|394
Python|2025-01|66|2026-01|1268
Java|2025-01|53|2026-01|1478
C++|2025-01|107|2026-01|470
select s1.job, date_format(s1.date,'%Y-%m') first_year_mon, s1.cnt as first_year_cnt, date_format(s2.date,'%Y-%m') second_year_mon, s2.cnt second_year_cnt
from (select job, date, sum(num) cnt
     from resume_info
     where year(date) = '2025'
     group by job,month(date)) s1
join (select job, date, sum(num) cnt
     from resume_info
     where year(date) = '2026'
     group by job,month(date)) s2
on s1.job = s2.job
and month(s1.date) = month(s2.date)
order by first_year_mon desc, job desc
1.可以直接在group by后面利用month()进行分组,而不用将日期转化为年月后建立再重新分组
2.利用date_format转化后的日期不能再用month函数
3.还可以用sub_str的方式进行日期截取,注意mysql需从1开始,否则会是空值,这一个地方与行编号从0开始有所不同
编辑于 2021-03-15 13:55:24 回复(7)
select a.job, 
    date_format(d1, '%Y-%m') first_year_mon, 
    c1 first_year_cnt, 
    date_format(d2, '%Y-%m') second_year_mon, 
    c2 second_yeat_cnt
from(
    select job, date d1, sum(num) c1
    from resume_info
    where year(date) = 2025
    group by month(date), job) a
join(
    select job, date d2, sum(num) c2
    from resume_info
    where year(date) = 2026
    group by month(date), job) b
on a.job = b.job
and month(d1) = month(d2)
order by first_year_mon desc, job desc;
今日第3题!
本SQL白菜发现一个脑洞上的误区,就是:date_format(date, '%Y-%m')生成的字段(如:2025-03)不能使用month()函数来取出其月份,亦就是说,month()函数的参数只能是完整的【年-月-日😣跟我一样的小白记得注意一下嗷,大佬们就请忽略我~🤣

发表于 2021-03-06 18:09:54 回复(14)
筛选2025年各岗位每月做临时表a,2026年各岗位每月做临时表b,再进行连接。
使用了concat把 “ %Y-%m ” 的字段组合成能被使用的 “ %Y-%m-%d ” 形式。

select 
    a.job,
    first_year_mon,
    first_year_cnt, 
    second_year_mon,
    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) a   
## 2025年各岗位每月的临时表
 
left 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) b
## 2026年各岗位每月的临时表

on month(concat(a.first_year_mon,'-01')) = 
   month(concat(b.second_year_mon,'-01'))

and a.job = b.job
order by first_year_mon desc,job desc




编辑于 2021-03-10 11:18:04 回复(0)
-- 考查自连接
-- 在上一题的基础上,自连接;利用t1.job = t2.job 和 substr(t1.mon, 1,7)= concat(year(t2.date) - 1,substr(t2.date, 5,3)) , 即second_year_cnt 减一年和 first_year_mon 相等
select t1.job, t1.mon as first_year_mon, t1.cnt as first_year_cnt, t2.mon as second_year_mon, t2.cnt as second_year_cnt
  from (select job, date, substr(date, 1,7) mon, sum(num) as cnt
                    from resume_info 
                 group by job, substr(date, 1,7)) t1 left join (select job, date, substr(date, 1,7) mon, sum(num) as cnt
                                                                                                                    from resume_info 
                                                                                                                 group by job, substr(date, 1,7)) t2  on t1.job = t2.job 
 where substr(t1.mon, 1,7)= concat(year(t2.date) - 1,substr(t2.date, 5,3)) and year(t1.date) = 2025
 order by first_year_mon desc, job desc;
  --  --------------------------     (*^▽^*)我是快乐的分割线 (#^.^#)-- -------------------------------------------- 
发表于 2021-03-08 18:20:05 回复(1)
select
    t1.job,t1.fd,t1.c,t2.sd,t2.c
from
    (SELECT
        job,substr(date,1,7) as fd,month(date) as m,sum(num) as c
    FROM
        resume_info
    WHERE
        year(date)=2025
    group BY
        job,concat(year(date)+'-'+month(date))) t1
left join
    (SELECT
        job,substr(date,1,7) as sd,month(date) as m,sum(num) as c
    FROM
        resume_info
    WHERE
        year(date)=2026
    group BY
        job,concat(year(date)+'-'+month(date))) t2
on
    t1.job=t2.job
and
    t1.m=t2.m
order BY
    t1.fd desc,t1.job desc

发表于 2021-07-17 16:57:24 回复(0)
select a.job,a.month as first_year_mon,a.cnt,b.month as second_year_mon,b.cnt
from(
        #first_year子表
        select *,
                left(date,7) month,
                substring(date, 6, 2) as sub, #--截取date这个字段,从第6个字符开始,直截取之后的2个字符(-也算字符)
                sum(num) as cnt
        from resume_info
        where year(date) = '2025'
        group by job,month) a
inner join(
            #second_year子表
            select *,
                    left(date,7) month,
                    substring(date, 6, 2) as sub,
                    sum(num) as cnt
            from resume_info
            where year(date) = '2026'
            group by job,month) b
on a.job=b.job and a.sub=b.sub
order by first_year_mon desc,a.job desc
发表于 2021-07-05 22:06:14 回复(0)
select a.job,a.mon as fisrt_year_mon,a.cnt as fisrt_year_cnt,
b.mon as second_year_mon,b.cnt as second_year_cnt
from (
  select job,date_format(date,'%Y-%m') as mon,sum(num) as cnt,date_format(date,'%m') as m
  from resume_info
  where date like '2025%'
  group by mon,job
)a
inner join (
  select job,date_format(date,'%Y-%m') as mon,sum(num) as cnt,date_format(date,'%m') as m
  from resume_info
  where date like '2026%'
  group by mon,job
)b
on a.m = b.m
and a.job = b.job
order by fisrt_year_mon desc,job desc
发表于 2021-06-03 17:19:00 回复(1)
制作2025年的总表t1,再制作2026年的总表t2,最后进行inner join即可完成题目
with t1 as (
select job, date, sum(num) as allnum
from resume_info
where year(date) = 2025
group by job, month(date)),
t2 as (
select job, date, sum(num) as allnum
from resume_info
where year(date) = 2026
group by job, month(date)
)
select t1.job, 
date_format(t1.date,'%Y-%m')first_year_mon, t1.allnum first_year_cnt,
date_format(t2.date,'%Y-%m')second_year_mon, t2.allnum second_year_cnt
from t1 inner join t2 on t1.job = t2.job 
AND month(t1.date) = month(t2.date)
order by first_year_mon DESC, job DESC;


编辑于 2021-06-01 23:24:31 回复(0)
-- 先找到2025年每个月每个岗位对应的数量
-- 再找到对应的2026年的每个月每个岗位的数量,使用DATE_ADD找出对应的日期
SELECT 
    ri.job,
    LEFT(ri.date,7) AS first_year_mon,
    SUM(num) AS first_year_cnt,
    LEFT(DATE_ADD(ri.date,INTERVAL 1 YEAR),7) AS second_year_mon,
    (
        SELECT SUM(num)
        FROM resume_info ri2
        WHERE LEFT(ri2.date,7) = LEFT(DATE_ADD(ri.date,INTERVAL 1 YEAR),7)
                AND ri2.job = ri.job
    ) AS second_year_cnt
FROM resume_info ri
WHERE YEAR(ri.date) = '2025'
GROUP BY first_year_mon,ri.job
ORDER BY first_year_mon DESC,ri.job DESC

发表于 2021-05-15 23:52:40 回复(0)
大致思路延续上一题,查出25年和26年符合条件的数据,之后在进行连接。原本想在连接条件里使用right()函数取得月份,但是没有行通,是 on 后面不能使用函数方法吗?
后用month()函数来取得日期月份
select T.job, T.mon first_year_mon, T.cnt first_year_cnt, T2.mon second_year_mon, T2.cnt second_year_cnt
from (
    select job, date_format(date, '%Y-%m') mon, sum(num) cnt, date
    from resume_info
    where YEAR(date) = '2025'
    group by job, mon
) T
left join (
    select job, date_format(date, '%Y-%m') mon, sum(num) cnt, date
    from resume_info
    where YEAR(date) = '2026'
    group by job, mon
) T2 on  T2.job = T.job 
and month(T2.date) = month(T.date) 
order by first_year_mon desc, job desc



发表于 2021-04-11 11:39:20 回复(1)
select distinct a.job
,a.first_year_mon
,a.first_year_cnt
,b.second_year_mon
,b.second_year_cnt
from (
        select job,substring(date,1,7) first_year_mon ,sum(num) first_year_cnt
        from resume_info
        where year(date)=2025
        group by job, first_year_mon
        order by first_year_mon desc,first_year_cnt desc
      )a
inner join
            (select job,substring(date,1,7) second_year_mon ,sum(num)second_year_cnt
            from resume_info
            where year(date)=2026
            group by job,second_year_mon
            order by second_year_mon desc,second_year_cnt desc) b
on a.job=b.job and substring(first_year_mon,5,7)=substring(second_year_mon,5,7)
order by a.first_year_mon desc,job desc
发表于 2021-03-31 14:58:39 回复(1)
2025年 join 2026年 条件是job=job,用substr选择月份=月份,最后从里面选数据就行。
select t1.job, mon1 as first_year_mon, sum1 as first_year_cnt,
mon2 as second_year_mon, sum2 as secound_year_cnt
from 
    (select job, substr(date,1,7) as mon1, sum(num) as sum1
    from resume_info
    where year(date) = 2025
    group by job, mon1) as t1
join
    (select job, substr(date,1,7) as mon2, sum(num) as sum2
    from resume_info
    where year(date) = 2026
    group by job, mon2) as t2
on t1.job = t2.job and substr(mon1,5,7) = substr(mon2,5,7)
order by first_year_mon DESC, job DESC


发表于 2021-03-25 17:47:15 回复(0)
with n as (
select job,date,sum(num) as first_year_cnt
from resume_info
where year(date) = 2025
group by job,month(date)
),
m as (
select job,date,sum(num) as second_year_cnt
from resume_info
where year(date) = 2026
group by job,month(date)
)
select n.job,date_format(n.date,'%Y-%m') as first_year_mon,first_year_cnt,date_format(m.date,'%Y-%m') as second_year_mon,second_year_cnt
from n as n inner join m as m
on n.job = m.job
where month(n.date) = month(m.date)
order by first_year_mon desc,n.job desc;

1.可以直接在group by后面利用month()进行分组,而不用将日期转化为年月后建立再重新分组
2.利用date_format转化后的日期不能再用month函数
3.还可以用sub_str的方式进行日期截取,注意mysql需从1开始,否则会是空值,这一个地方与行编号从0开始有所不同
发表于 2021-07-28 20:23:46 回复(0)
select A.job, A.mon first_year_mon, A.cnt,
-- 日期格式至少是年月日:STR_TO_DATE(concat(A.mon,'-','01'), '%Y-%m-%d')
DATE_FORMAT(
    DATE_ADD(STR_TO_DATE(concat(A.mon,'-','01'), '%Y-%m-%d'), INTERVAL 1 YEAR),
    '%Y-%m'
) as second_year_mon,
(
    -- 对应的2026年的同一个月同岗位,收到简历的数目
    select sum(num) cnt
    from resume_info
    where DATE_FORMAT(date, '%Y-%m') = DATE_FORMAT(
        DATE_ADD(STR_TO_DATE(concat(A.mon,'-','01'), '%Y-%m-%d'), INTERVAL 1 YEAR),
        '%Y-%m'
    )
    AND job = A.job
    group by job, mon
) as second_year_cnt
from (
    -- 查询在2025年投递简历的每个岗位,每一个月内收到简历的数目
    select job, 
    DATE_FORMAT(date, '%Y-%m') as mon, 
    sum(num) cnt
    from resume_info
    where date >= '2025-01-01' and date <= '2025-12-31'
    group by job, mon
) A 
-- 最后的结果先按first_year_mon月份降序,再按job降序排序显示
order by first_year_mon desc, A.job desc


编辑于 2021-07-26 15:48:02 回复(0)
SELECT a.job,a.mon,a.cnt,b.mon,b.cnt
FROM (SELECT job,DATE_FORMAT(DATE,'%Y-%m') AS mon,SUM(num) AS cnt
FROM resume_info 
WHERE YEAR(DATE)=2025
GROUP BY job,mon
ORDER BY job DESC,mon DESC) a
JOIN (SELECT job,DATE_FORMAT(DATE,'%Y-%m') AS mon,SUM(num) AS cnt
FROM resume_info 
WHERE YEAR(DATE)=2026
GROUP BY job,mon
ORDER BY job DESC,mon DESC
) b
ON a.job=b.job
AND RIGHT(a.mon,2)=RIGHT(b.mon,2)
ORDER BY a.mon DESC,a.job DESC

发表于 2021-07-25 19:49:30 回复(0)
SELECT t1.job,
t1.d,t1.s ,t2.d,t2.s
from (select job,date_format(date,"%Y-%m") d ,sum(num) s from resume_info
where date_format(date,"%Y")=2025
GROUP by job, date_format(date,"%Y-%m") ) t1
inner join (select job,date_format(date,"%Y-%m") d ,sum(num) s from resume_info
where date_format(date,"%Y")=2026
GROUP by job, date_format(date,"%Y-%m") ) t2
on t1.job=t2.job and right(t1.d,2)= right(t2.d,2)
order by t1.d desc,t1.job desc
发表于 2021-07-23 11:45:18 回复(0)
-- 思路都是筛选2025年各岗位每月做临时表a,2026年各岗位每月做临时表b,再进行连接
-- 我的看似复杂,其实结构也是这个
select a.job
,first_year_mon
,first_year_cnt
,second_year_mon
,second_year_cnt
from
(
select job
,substring(date,1,7) first_year_mon
,substring(date,6,2) first_mon
,sum(num) first_year_cnt
from resume_info r1
where substring(date,1,4) = '2025'
group by 1,2,3
) a
join
(
select job
,substring(date,1,7) second_year_mon
,substring(date,6,2) second_mon
,sum(num) second_year_cnt
from resume_info r2
where substring(date,1,4) = '2026'
group by 1,2,3
) b
on a.job = b.job
and a.first_mon = b.second_mon
order by first_year_mon desc,a.job desc

发表于 2021-07-22 10:24:58 回复(0)
SELECT a.job,a.first_year_mon,a.first_year_cnt,b.second_year_mon,b.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) as a
left 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) as b
on a.job= b.job and MONTH(a.first_year_mon)=MONTH(b.second_year_mon)
为什么不对呢
发表于 2021-07-19 16:20:28 回复(0)
select a.job,a.first_year_mon,a.first_year_cnt,b.second_year_mon,b.second_year_cnt
from
(SELECT job,left(date,7) as first_year_mon,sum(num) as first_year_cnt
from resume_info where left(date,4)='2025' GROUP by job,first_year_mon 
) a
left JOIN 
(SELECT job,left(date,7) as second_year_mon,sum(num) as second_year_cnt
from resume_info where left(date,4)='2026' GROUP by job,second_year_mon) b
on (a.job,mid(a.first_year_mon,6,2))=(b.job,mid(b.second_year_mon,6,2))
 order by a.first_year_mon desc,a.job desc;

发表于 2021-07-14 10:46:30 回复(0)
(1)join
select distinct t1.job,t1.month first_year_mon,t1.cnt first_year_cnt,
t2.month second_year_mon,t2.cnt second_year_cnt from(
select job, DATE_FORMAT(date,'%Y-%m') month,sum(num) cnt from resume_info
where year(date) = '2025' 
group by month,job
order by month desc,job desc) t1
join (select job, DATE_FORMAT(date,'%Y-%m') month,sum(num) cnt from resume_info
where year(date) = '2026' 
group by month,job
order by month desc,job desc) t2
on t1.job = t2.job and right(t1.month,2) = right(t2.month,2)
-- 最后链接月份时可以用right,也可以用substr,但是right好像更快
(2)写两个表链接起来
with r1 as 
(select job, DATE_FORMAT(date,'%Y-%m') first_year_mon,sum(num) first_year_cnt from resume_info
where year(date) = '2025' 
group by first_year_mon,job),
r2 AS
(select job, DATE_FORMAT(date,'%Y-%m') second_year_mon,sum(num) second_year_cnt from resume_info
where year(date) = '2026' 
group by second_year_mon,job)
select r1.job, first_year_mon,
first_year_cnt,
second_year_mon,
second_year_cnt
from r1,r2
where r1.job = r2.job and right(first_year_mon,2) = right(second_year_mon,2)
order by first_year_mon desc,r1.job desc

发表于 2021-07-14 09:47:24 回复(0)