01
—
场景描述
有一个录取学生人数表 in_school_stu,记录的是每年录取学生的人数及录取学生的学制,计算每年在校学生人数。

02
—
数据准备
create table in_school_stu as(select stack(5,1,2001,2,1200,2,2000,5,1300,3,2003,4,1400,4,2002,3,1500,5,2002,2,1600) as(id,year,stu_num,stu_len));

03
—
问题分析
本题实际上属于区间重叠问题,我们将入年份与学制加起来得到结束时间
select id, year year_start, year + stu_len - 1 year_end, stu_numfrom in_school_stu

通过上面简单的分析可以看到该问题为典型的区间重叠问题,将时间展开后,具体分析可参考如下图。

第一步:利用posexplode()先将数据展开,转换为明细表
select id, pos, year year_start, year + pos year_end, stu_numfrom in_school_stu stulateral view posexplode(split(space(stu_len - 1), '(?!&)')) tmp as pos, val

第二步:基于步骤1的明细表,按时间汇总即可。SQL如下:
select year + pos year, sum(stu_num) stu_numfrom in_school_stu stulateral view posexplode(split(space(stu_len - 1), '(?!&)')) tmp as pos, valgroup by year + pos;

第三步: 用上述结果关联数据表中入学年份得到最终结果。注意数据表中要去重。
select t1.year year, stu_numfrom (select year + pos year, sum(stu_num) stu_numfrom in_school_stu stulateral view posexplode(split(space(stu_len - 1), '(?!&)')) tmp as pos, valgroup by year + pos) t1join(select year from in_school_stu group by year)t2on t1.year = t2.year;

04
—
小结
本文对在校学生人数统计这一问题进行了分析,如果对本专栏区间重叠问题这一技巧和方法比较熟的,解决该问题会非常简单。
区间重叠问题
SQL进阶技巧:如何按任意时段分析时间区间问题?| 分区间讨论【左、中、右】

文章转载自会飞的一十六,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




