统计每年在校人数

发布时间:2023年12月22日

统计每年在校人数

问题:
有一张招生人数信息表, 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)
)
idyear_strnumyear_ins
1001201910003
1002202020004
1003202010003
1004202115003
1005202121004
1006202220004
2- 代码实现
-- 1. 计算出每批招生在校的所有年份 year_part
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
;
idyear_strnumyear_insposyear_part
100120191000302019
100120191000312020
100120191000322021
100120191000332022
100220202000402020
100220202000412021
100220202000422022
100220202000432023
100220202000442024
100320201000302020
100320201000312021
-- 2. 计算出每年在校的总人数
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
;
yaersstu_num
20191000
20204000
20217600
20229600
20238600
20247600
20254100
20262000
3- 总结
posexplode()函数: 该函数可以将index和数据都取出来。
可以使用 index 作为值和招生年份相加, 得出在校年份, 因为index是从0 开始的, 所以需要将年制 加1 。
SELECT tab.pos, val
lateral view posexplode(split(repeat('1,',4),',')) tab as pos,val ;
posval
01
11
21
31
end
文章来源:https://blog.csdn.net/Taerge0110/article/details/135137626
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。