统计每年在校人数
问题:
有一张招生人数信息表, year_str:招生年度; num:招生人数; year_ins:招生年制,几年制学习
从这张表中统计每年在校人数分别是多少
说明: 2020年 招生2000人,年制是3年, 该批学生在校时间为, 2020~2023年, 统计每年在校人数时, 2020、2021、2022、2023 每年都要统计上
1- 数据准备
招生信息表:
id:数据id; year_str:招生年度; num:招生人数; year_ins:招生年制,几年制学习
WITH t_enroll_info AS (
SELECT * FROM (
VALUES
(1001, 2019, 1000, 3)
, (1002, 2020, 2000, 4)
, (1003, 2020, 1000, 3)
, (1004, 2021, 1500, 3)
, (1005, 2021, 2100, 4)
, (1006, 2022, 2000, 4)
) AS table_name(id, year_str, num, year_ins)
)
id | year_str | num | year_ins |
---|
1001 | 2019 | 1000 | 3 |
1002 | 2020 | 2000 | 4 |
1003 | 2020 | 1000 | 3 |
1004 | 2021 | 1500 | 3 |
1005 | 2021 | 2100 | 4 |
1006 | 2022 | 2000 | 4 |
2- 代码实现
SELECT
id, year_str, num, year_ins
, lv.pos
, year_str + lv.pos AS year_part
FROM t_enroll_info t1
LATERAL VIEW POSEXPLODE(split(repeat('#,',year_ins + 1),',')) lv AS pos,val
;
id | year_str | num | year_ins | pos | year_part |
---|
1001 | 2019 | 1000 | 3 | 0 | 2019 |
1001 | 2019 | 1000 | 3 | 1 | 2020 |
1001 | 2019 | 1000 | 3 | 2 | 2021 |
1001 | 2019 | 1000 | 3 | 3 | 2022 |
1002 | 2020 | 2000 | 4 | 0 | 2020 |
1002 | 2020 | 2000 | 4 | 1 | 2021 |
1002 | 2020 | 2000 | 4 | 2 | 2022 |
1002 | 2020 | 2000 | 4 | 3 | 2023 |
1002 | 2020 | 2000 | 4 | 4 | 2024 |
1003 | 2020 | 1000 | 3 | 0 | 2020 |
1003 | 2020 | 1000 | 3 | 1 | 2021 |
… | … | … | … | … | … |
SELECT
year_part AS yaers
, SUM(num) AS stu_num
FROM (
SELECT
id, year_str, num, year_ins
, lv.pos
, year_str + lv.pos AS year_part
FROM t_enroll_info t1
LATERAL VIEW POSEXPLODE(split(repeat('#,',year_ins + 1),',')) lv AS pos,val
) a
GROUP BY year_part
;
yaers | stu_num |
---|
2019 | 1000 |
2020 | 4000 |
2021 | 7600 |
2022 | 9600 |
2023 | 8600 |
2024 | 7600 |
2025 | 4100 |
2026 | 2000 |
3- 总结
posexplode()函数: 该函数可以将index和数据都取出来。
可以使用 index 作为值和招生年份相加, 得出在校年份, 因为index是从0 开始的, 所以需要将年制 加1 。
SELECT tab.pos, val
lateral view posexplode(split(repeat('1,',4),',')) tab as pos,val ;
end