-- 链接 LINK: https://www.nowcoder.com/practice/83f84aa5c32b4cf5a75558d02dd7743c?tpId=82&rp=1&ru=%2Fexam%2Foj&qru=%2Fexam%2Foj&sourceUrl=%2Fexam%2Foj%3Fdifficulty%3D5%26page%3D1%26pageSize%3D50%26search%3D%26tab%3DSQL%25E7%25AF%2587%26topicId%3D82&difficulty=5&judgeStatus=&tags=&title=&gioEnter=menu
-- 标题 TITLE: SQL280 实习广场投递简历分析(三)
-- 日期 DATE: 2023-02-25

/* 设计思路
    解法加大了点难度,增加补全 12 月份的信息,以及考虑 2025 年和 2026 年岗位存在差异等情况
**/

-- 题解 SQL

-- 12 个月份临时表
WITH RECURSIVE monthly AS (
  SELECT 12 AS months
  UNION
  SELECT months-1 AS months FROM monthly WHERE months > 1
)

SELECT IFNULL(T2.job, T3.job) AS job, 
        IFNULL(T2.date, CONCAT('2025-', T1.months)) AS first_year_mon, 
        IFNULL(T2.cnt, 0) AS first_year_cnt,
        IFNULL(T3.date, CONCAT('2026-', T1.months)) AS second_year_mon, 
        IFNULL(T3.cnt, 0) AS second_year_cnt
FROM monthly T1
LEFT JOIN (
    -- 2025 年每月各职位投递份数,存在部分月份缺失
    SELECT DISTINCT job, DATE_FORMAT(date, '%Y-%m') AS date, MONTH(date) AS months,
        SUM(num) OVER(PARTITION BY job, DATE_FORMAT(date, '%Y-%m')) AS cnt
       FROM resume_info
    WHERE YEAR(date) = 2025 
) T2 ON T2.months = T1.months
LEFT JOIN (
    -- 2026 年每月各职位投递份数,存在部分月份缺失
    SELECT DISTINCT job, DATE_FORMAT(date, '%Y-%m') AS date, MONTH(date) AS months,
        SUM(num) OVER(PARTITION BY job, DATE_FORMAT(date, '%Y-%m')) AS cnt
       FROM resume_info
    WHERE YEAR(date) = 2026
) T3 ON T3.months = T1.months
WHERE (T2.job = T3.job AND T2.job IS NOT NULL) OR NOT (T2.job IS NULL AND T3.job IS NULL)
ORDER BY first_year_mon DESC, job DESC

;

-- 数据 DATA ===================================================
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);