首页 > 试题广场 >

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

[编程题]实习广场投递简历分析(三)
  • 热度指数:85518 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
在牛客实习广场有很多公司开放职位给同学们投递,同学投递完就会把简历信息存到数据库里。
现在有简历信息表(resume_info),部分信息简况如下:
id job date num
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-01-04
260
20 Java
2026-02-14 721
21 Python
2026-02-14
321
22 C++
2026-02-14
134
23 Java
2026-02-24
928
24 Python
2026-02-24
525
25 C++
2027-02-06
231

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

请你写出SQL语句查询在2025年投递简历的每个岗位,每一个月内收到简历的数目,和对应的2026年的同一个月同岗位收到简历的数目,最后的结果先按first_year_mon月份降序,再按job降序排序显示,以上例子查询结果如下:
job first_year_mon first_year_cnt second_year_mon
second_year_cnt
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
解析:
第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
# 2025年的所有数据
# select job,mon as first_year_mon,sum(num)as first_year_cnt from
# (select id,job,date_format(date,'%Y-%m')as mon, num from resume_info
# where year(date) = '2025')a
# group by job,mon
# order by job desc, first_year_mon desc
# 2026年的所有数据
# select job,mon as second_year_mon,sum(num)as second_year_cnt from
# (select id,job,date_format(date,'%Y-%m')as mon, num from resume_info
# where year(date) = '2026')a
# group by job,mon
# order by job desc,second_year_mon desc, 
# 两表连接
select b.job,first_year_mon,first_year_cnt,second_year_mon,second_year_cnt from
(select job,mon as first_year_mon,sum(num)as first_year_cnt from
(select id,job,date_format(date,'%Y-%m')as mon, num from resume_info
where year(date) = '2025')a
group by job,mon
order by job desc, first_year_mon desc)b
left join 
(select job,mon as second_year_mon,sum(num)as second_year_cnt from
(select id,job,date_format(date,'%Y-%m')as mon, num from resume_info
where year(date) = '2026')d
group by job,mon
order by job desc,second_year_mon desc)c
on b.job = c.job
# and date_add(b.first_year_mon ,interval 1 year) = c.second_year_mon #不知道为啥这个条件筛选不了
# 不加这个条件就会重复
and right(first_year_mon,2)=right(second_year_mon,2)
order by first_year_mon desc,job desc

发表于 2022-03-23 11:06:21 回复(0)
select a.job
,a.date
,a.num
,b.date
,b.num
from
(select job --算出2025年的汇总
,substr(date,1,7) date
,sum(num) num
from resume_info
where substr(date,1,4)='2025'
group by job,substr(date,1,7)
 ) a
 join
 (select job  --算出2026年的汇总
,substr(date,1,7) date
,sum(num) num
from resume_info
where substr(date,1,4)='2026'
group by job,substr(date,1,7)
 ) b
 on a.job=b.job
 where substr(a.date,6,7)=substr(b.date,6,7)
 order by a.date desc,a.job desc


发表于 2022-02-11 15:51:43 回复(1)
select t1.*,t2.mon2,t2.cnt2
from(select job,DATE_FORMAT(date,'%Y-%m') mon1,sum(num) cnt1
from resume_info
where date>'2025-01-01' and date<'2025-12-31'
group by job,DATE_FORMAT(date,'%Y-%m')) t1
join(select job,DATE_FORMAT(date,'%Y-%m') mon2,sum(num) cnt2
from resume_info
where date>'2026-01-01' and date<'2026-12-31'
group by job,DATE_FORMAT(date,'%Y-%m')) t2
on t1.job=t2.job and SUBSTR(t1.mon1,-2)=SUBSTR(t2.mon2,-2)
order by t1.mon1 desc,t1.job desc
发表于 2021-12-08 16:29:23 回复(0)
SELECT f.job,
f.mon as first_year_mon, first_year_cnt,
s.mon as second_year_mon, second_year_cnt
FROM(SELECT job, left(date,7) mon, sum(num) first_year_cnt
     FROM resume_info
     WHERE year(date)=2025
     GROUP BY job, left(date,7)) f,
    (SELECT job, left(date,7) mon, sum(num) second_year_cnt
     FROM resume_info
     WHERE year(date)=2026
     GROUP BY job, left(date,7)) s
WHERE f.job=s.job and right(f.mon,2)=right(s.mon,2)
ORDER BY first_year_mon desc, job desc;

发表于 2021-10-16 09:15:17 回复(0)
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 t1.job,t1.first_year_mon,t1.first_year_cnt,t2.second_year_mon,t2.second_year_cnt
from (select job,strftime('%Y-%m',date) as first_year_mon,strftime('%m',date)as mon1,sum(num) as first_year_cnt
from resume_info
where date>='2025-01-01' and date<='2025-12-31'
group by job,first_year_mon) t1 
left join (select job,strftime('%Y-%m',date) as second_year_mon,strftime('%m',date) as mon2,sum(num) as second_year_cnt
from resume_info
where date>='2026-01-01' and date<='2026-12-31'
group by job,second_year_mon) t2 on t1.job=t2.job and t1.mon1=t2.mon2
order by t1.first_year_mon desc,t1.job desc
在sqlite中不能date_time和month直接提取,改为strftime
发表于 2021-03-10 11:50:42 回复(0)
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 回复(24)
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 回复(14)
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)
筛选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 回复(4)
SELECT f.job AS job,
f.mon AS first_year_mon, f.cnt AS first_year_cnt,
s.mon AS second_year_mon, s.cnt AS second_year_cnt
FROM
(
    SELECT job, LEFT(date, 7) AS mon, SUM(num) AS cnt
    FROM resume_info
    WHERE YEAR(date) = '2025'
    GROUP BY job, LEFT(date, 7)
) AS f 
JOIN
(
    SELECT job, LEFT(date, 7) AS mon, SUM(num) AS cnt
    FROM resume_info
    WHERE YEAR(date) = '2026'
    GROUP BY job, LEFT(date, 7)
) AS s
ON (f.job=s.job)
AND (RIGHT(f.mon, 2)=RIGHT(s.mon, 2))
ORDER BY first_year_mon DESC, job DESC;

发表于 2021-08-22 15:51:00 回复(0)
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 回复(2)
-- 考查自连接
-- 在上一题的基础上,自连接;利用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 job 
    ,max(case when substring(date,1,4)='2025' then substring(date,1,7) end)
    ,sum(case when substring(date,1,4)='2025' then num end)
    ,max(case when substring(date,1,4)='2026' then substring(date,1,7) end)
    ,sum(case when substring(date,1,4)='2026' then num end)
from resume_info
group by job ,substring(date,6,2)
order by max(case when substring(date,1,4)='2025' then substring(date,1,7) end) desc ,job desc
;

发表于 2023-02-04 01:16:21 回复(1)
# 思路  第二题的答案拼两次,一次为2025的,一次为2026的。
然后按照月份和工作一样进行join
select a.job, a.datee, a.sl, b.datee, b.sl
from (select job, date_format(date, '%Y-%m') as datee, sum(num) as sl
    from resume_info
    where year(date) = '2025'
    group by datee, job
    order by datee  desc, sl desc) a
join (select job, date_format(date, '%Y-%m') as datee, sum(num) as sl
    from resume_info
    where year(date) = '2026'
    group by datee, job
    order by datee  desc, sl desc) b
on a.job = b.job and right(a.datee, 2) = right(b.datee, 2)
order by a.datee desc, job desc


发表于 2022-04-20 14:50:12 回复(0)
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,date_format(date,"%Y-%m")) as a
inner 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,date_format(date,"%Y-%m")) as b
on a.job=b.job and right(a.first_year_mon,2)=right(b.second_year_mon,2)
order by first_year_mon desc,a.job desc
-- 总体来说,这道题不难,就是搞清楚解题思路,然后一步一步写出来代码即可。
-- (1)首先我们可以根据 实习广场投递简历分析(二) 的这道题的代码得到左侧的2025的答案
-- (2)接着依葫芦画瓢,把条件更改成2026年即可得到右侧两列的答案
-- (3)最后,需要将这两个虚拟表链接起来,一个条件肯定是要两个表的job名字一样,另一个
-- 条件肯定是2025第几个月对应上2026年相同的月份,而在之前我们已经根据筛选条件,把左侧表
-- 筛选成了2025年右侧表为2026年了,接下来只需要看如何把两个表的月份拼成一样的就行了,依靠的
-- 是取子串的方式,用right取右侧两个字符即可

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,date_format(date,"%Y-%m")) as a
-- 上面的代码为答案的左侧三列
inner 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,date_format(date,"%Y-%m")) as b
-- 上面的代码为答案的右侧两列
on a.job=b.job and right(a.first_year_mon,2)=right(b.second_year_mon,2)
-- 链接条件为两张表的job名字相同 并 月份一样即可,因为年份在上两步代码中已经筛选过了
order by first_year_mon desc,a.job desc
-- 最后按照题意进行排序即可

发表于 2022-02-18 15:09:31 回复(0)
select s1.job, left(s1.date,7) first_year_mon, sum(s1.cnt) first_year_cnt,
left(s2.date,7) second_year_mon, sum(s2.cnt) first_year_cnt
from 
(select job, date, sum(num) cnt
 from resume_info 
 where year(date)=2025
 group by job, month(date)
) s1
left 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)
group by s1.job, first_year_mon
order by first_year_mon desc, s1.job desc




本质上就是将s1和s2两张表联结起来进行查询
发表于 2021-10-02 22:19:30 回复(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 回复(2)
制作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 回复(1)