统计每年在校人数

统计每年在校人数

问题:
有一张招生人数信息表, 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
  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值