首页 > 试题广场 >

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

[编程题]实习广场投递简历分析(三)
  • 热度指数:72832 时间限制: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
SELECT
    r1.job,
    r1.first_year_mon,
    r1.first_year_cnt,
    r2.second_year_mon,
    r2.second_year_cnt
FROM (
    SELECT
        job,
        MONTH(date) AS mon_date,
        DATE_FORMAT(date, '%Y-%m') AS first_year_mon,
        sum(num) AS first_year_cnt
    FROM resume_info 
    WHERE date BETWEEN '2025-01-01' AND '2025-12-31'
    GROUP BY job, mon_date, first_year_mon
) AS r1
LEFT JOIN (
    SELECT
        job,
        MONTH(date) AS mon_date,
        DATE_FORMAT(date, '%Y-%m') AS second_year_mon,
        sum(num) AS second_year_cnt
    FROM resume_info 
    WHERE date BETWEEN '2026-01-01' AND '2026-12-31'
    GROUP BY job, mon_date, second_year_mon
) AS r2
    USING(job, mon_date)
ORDER BY r1.mon_date DESC, job DESC;

发表于 2024-04-26 11:25:14 回复(0)
select  # 直接从两张表取计算结果
    r1.job,
    first_year_mon,
    first_year_cnt,
    second_year_mon,
    second_year_cnt
from (  # from处嵌套子查询,为2025年的计算结果
    select 
        job,
        left(date,7) as first_year_mon,
        sum(num) as first_year_cnt
    from resume_info 
    where year(date) = 2025
    group by job, left(date,7)) r1
inner join (  # join处嵌套子查询,为2026年的计算结果
    select
        job,
        left(date,7) as second_year_mon,
        sum(num) as second_year_cnt
    from resume_info
    where year(date) = 2026
    group by job, left(date,7)) r2
on r1.job = r2.job and right(r1.first_year_mon,2) = right(r2.second_year_mon,2)
# 两张表用job和月份连接
order by first_year_mon desc, job desc

发表于 2024-04-12 15:56:09 回复(0)
感觉自己究极头铁
select f.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,month(date) as mon1
    from resume_info
    where year(date) = '2025'
    group by job,first_year_mon,mon1
) f
inner join (
    select job,date_format(date,'%Y-%m') as second_year_mon,sum(num) as second_year_cnt,month(date)  as mon2
    from resume_info
    where year(date) = '2026'
    group by job,second_year_mon,mon2
) s
on f.job = s.job and f.mon1 = s.mon2
order by first_year_mon desc,f.job desc


编辑于 2024-04-12 09:55:36 回复(0)
select a.job, a.first_year_mon, a.cnt first_year_cnt, b.second_year_mon, b.cnt second_year_cnt
from
(select job, date_format(date,'%Y-%m') first_year_mon, sum(num) cnt
from resume_info
where date like '2025-%-%'
group by job, first_year_mon) a
left join
(select job, date_format(date,'%Y-%m') second_year_mon, sum(num) cnt
from resume_info
where date like '2026-%-%'
group by job, second_year_mon) b
on right(a.first_year_mon,2)=right(b.second_year_mon,2) and a.job=b.job
order by a.first_year_mon desc, a.job desc


发表于 2024-03-27 15:56:21 回复(0)
select t1.job,t1.yearmon as first_year_mon,t1.cnt as first_year_cnt,
t2.yearmon as second_year_mon,t2.cnt as second_year_cnt from
(select job,date_format(date,"%Y-%m") as yearmon,month(date) as mon,sum(num) as cnt
from resume_info
where date >= "2025-01-01" and date <= "2025-12-31"
group by job,yearmon,mon) as t1 inner join
(select job,date_format(date,"%Y-%m") as yearmon,month(date) as mon,sum(num) as cnt
from resume_info
where date >= "2026-01-01" and date <= "2026-12-31"
group by job,yearmon,mon) as t2
on t1.job=t2.job and t1.mon=t2.mon
order by first_year_mon desc,job desc;

发表于 2024-03-10 10:25:01 回复(0)
WITH resume_2025 AS (
	SELECT
		job 
		,DATE_FORMAT(date, "%Y-%m") AS year_mon
		,SUM(num) AS year_cnt
	FROM resume_info
	WHERE date LIKE "2025%"
	GROUP BY 1, 2
),
resume_2026 AS (
	SELECT
		job
		,DATE_FORMAT(date, "%Y-%m") AS year_mon
		,SUM(num) AS year_cnt 
	FROM resume_info
	WHERE date LIKE "2026%"
	GROUP BY 1, 2
)
SELECT 
	r1.job
	,r1.year_mon AS first_year_mon
	,r1.year_cnt AS first_year_cnt
	,r2.year_mon AS second_year_mon
	,r2.year_cnt AS second_year_cnt
FROM resume_2025 r1
LEFT JOIN resume_2026 r2 
ON (right(r1.year_mon, 2) = right(r2.year_mon, 2) AND r1.job = r2.job)
ORDER BY 2 DESC, 1 DESC;


发表于 2024-02-26 18:09:39 回复(0)
select aa.job, aa.first_year_mon,aa.first_year_cnt,bb.second_year_mon,bb.second_year_cnt
from 
(select job,left(date,7) first_year_mon,sum(num) as first_year_cnt
from resume_info
where year(date)='2025'
group by job,left(date,7)) aa
left join 
(select job,left(date,7) second_year_mon,sum(num) as second_year_cnt
from resume_info
where year(date)='2026'
group by job,left(date,7)) bb
on aa.job=bb.job and right(aa.first_year_mon,2)=right(bb.second_year_mon,2)
order by aa.first_year_mon desc, aa.job desc

编辑于 2024-01-02 15:54:23 回复(0)
select
a.job,
a.m as first_year_mon,a.cnt as first_year_cnt,
b.m as second_year_mon,b.cnt as second_year_cnt
from
(select
distinct
job,
left(date,7) as m,
sum(num)over(partition by job,left(date,7)) as cnt
from resume_info
where left(date,4)='2025')a
inner join
(select
distinct
job,
left(date,7) as m,
sum(num)over(partition by job,left(date,7)) as cnt
from resume_info
where left(date,4)='2026')b
on a.job=b.job
and right(a.m,2)=right(b.m,2)
order by first_year_mon desc,a.job desc;

发表于 2023-12-08 15:58:49 回复(0)
WITH 
r1 AS
(
SELECT job, DATE_FORMAT(date, '%Y-%m') AS first_year_mon, SUM(num) AS first_year_cnt
FROM resume_info
WHERE date LIKE '2025%'
GROUP BY job, first_year_mon
),
r2 AS
(
SELECT job, DATE_FORMAT(date, '%Y-%m') AS second_year_mon, SUM(num) AS second_year_cnt
FROM resume_info
WHERE date LIKE '2026%'
GROUP BY job, second_year_mon
)

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;

发表于 2023-11-27 22:06:39 回复(0)
with t1 as (
    select
        job,
        date_format(date,'%Y-%m') year_mon,
        sum(num) cnt
    from resume_info
    where year(date) = 2025
    group by job,year_mon
),
t2 as (
    select
        job,
        date_format(date,'%Y-%m') year_mon,
        sum(num) cnt
    from resume_info
    where year(date) = 2026
    group by job,year_mon
)
select
    t1.job,
    t1.year_mon first_year_mon,
    t1.cnt first_year_cnt,
    t2.year_mon second_year_mon,
    t2.cnt second_year_cnt
from t1,t2
where t1.job = t2.job
and right(t1.year_mon,2) = right(t2.year_mon,2)
order by first_year_mon desc,job desc;

发表于 2023-11-14 14:27:11 回复(0)
很多时候用left和right函数来截取时间片段更简单,一样好用
with cte as (
SELECT job,left(date,7) as mon ,sum(num) as cnt
FROM resume_info
where year(date) in (2025,2026)
group by job,mon
order by mon desc,cnt desc )
select a.job,a.mon as first_year_mon, a.cnt as first_year_cnt,
             b.mon as second_year_mon,b.cnt as second_year_cnt
from cte a left join cte b on a.job=b.job and left(b.mon,4)-left(a.mon,4)=1 
                                          and right(a.mon,2)=right(b.mon,2)
where left(a.mon,4)=2025
order by first_year_mon desc ,job desc


发表于 2023-10-16 16:38:21 回复(0)
select a.job,first_year_mon,first_year_cnt,second_year_mon,second_year_cnt
from
(select job,left(date,7) as first_year_mon,sum(num) as first_year_cnt
from resume_info r
where year(date)=2025
group by 1,2) a
join
(select job,left(date,7) as second_year_mon,sum(num) as second_year_cnt
from resume_info r
where year(date)=2026
group by 1,2) 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
发表于 2023-09-09 18:05:38 回复(0)
select distinct a.job,a.mon,a.sl,b.mon,b.sl From 
(select job,date_format(date,'%Y-%m') as mon,sum(num) sl,dense_rank() over(order by date_format(date,'%Y-%m')) rk from resume_info
where year(date)='2025'
group by job,mon
) a
left join 
(select job,date_format(date,'%Y-%m') as mon,sum(num) sl,dense_rank() over(order by date_format(date,'%Y-%m')) rk from resume_info
where year(date)='2026'
group by job,mon
) b on a.job=b.job and a.rk=b.rk
order by a.mon desc ,job desc

发表于 2023-08-03 13:25:19 回复(0)
我之前是按分组取的表,然后用first_year_mon再取月份发现是空值,不知道为啥是空值,然后又换成这样就过了
select  b.job,first_year_mon,first_year_cnt,second_year_mon,second_year_cnt from
 (select distinct job,date_format(date,'%Y-%m') as first_year_mon,sum(num)over(partition by job,date_format(date,'%Y-%m'))first_year_cnt,
date_format(date,'%m')m1 from resume_info
where date like'2025%'
) as b
 join
(select distinct job,date_format(date,'%Y-%m') as second_year_mon,sum(num)over(partition by job,date_format(date,'%Y-%m'))second_year_cnt,
date_format(date,'%m')m2 from resume_info
where date like'2026%') as c
on b.job=c.job and b.m1=c.m2
order by first_year_mon desc,job desc
发表于 2023-06-25 14:50:04 回复(0)
with
    t1 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
            job,
            first_year_mon
    ),
    t2 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
            job,
            second_year_mon
    )
select
    t1.job,
    t1.first_year_mon,
    t1.first_year_cnt,
    t2.second_year_mon,
    t2.second_year_cnt
from
    t1
    inner join t2 on t1.job = t2.job
    and right (t2.second_year_mon, 2) = right (t1.first_year_mon, 2)
order by
    t1.first_year_mon desc,
    t1.job desc;

发表于 2023-06-10 12:12:02 回复(0)
group by例题和自联结例题
# 请你写出SQL语句查询在2025年投递简历的每个岗位,每一个月内收到简历的数目,和对应的2026年的同一个月同岗位,收到简历的数目,最后的结果先按first_year_mon月份降序,再按job降序排序显示

# 先拿到每个岗位每个月份多少人投递
with total_info as(
    select job,
    date_format(date,"%Y%m") as date,
    sum(num) as cnt
    from resume_info
    group by job,date_format(date,"%Y%m")
)

# 自联结就行
select t1.job,
INSERT(t1.date, 5, 0, '-') as first_year_mon,
t1.cnt as first_year_cnt,
INSERT(t2.date, 5, 0, '-')  as second_year_mon,
t2.cnt as second_year_cnt
from total_info t1
join 
total_info t2
on t1.job=t2.job 
and period_diff(t1.date,t2.date)=-12
where t1.date like "2025%" and t2.date like "2026%"
order by first_year_mon desc,job desc


发表于 2023-03-23 22:23:35 回复(0)
with t1
as(
select job,substr(date, 1,7) as mon, sum(num) as cnt
from resume_info 
group by job,substr(date, 1,7))
select a.job,a.mon as first_year_mon, a.cnt as first_year_cnt ,b.mon as second_year_mon, b.cnt as second_year_cnt
from(
    select job,mon, cnt
    from t1
    where substr(mon,1,4) = '2025'
    ) a
join
    (
    select job,mon, cnt
    from t1
    where substr(mon,1,4) = '2026'
    ) b
on a.job = b.job
and substr(a.mon,6,7) = substr(b.mon,6,7)
order by first_year_mon desc, job desc;

发表于 2023-01-11 22:59:23 回复(0)
select t1.job,first_year_mon,first_year_cnt,second_year_mon,second_year_cnt
from (
    select job,left(`date`,7) as first_year_mon,
    sum(num) as first_year_cnt
    from resume_info
    where year(`date`) = 2025
    group by job,left(`date`,7)
)t1
inner join (
    select job,left(`date`,7) as second_year_mon,
    sum(num) as second_year_cnt
    from resume_info
    where year(`date`) = 2026
    group by job,left(`date`,7) 
)t2 
on t1.job = t2.job and right(t1.first_year_mon,2) = right(t2.second_year_mon,2)
order by first_year_mon desc,job desc

发表于 2023-01-04 23:21:17 回复(0)

问题信息

上传者:牛客301499号
难度:
183条回答 4404浏览

热门推荐

通过挑战的用户

查看代码