如何在 LATERAL VIEW EXPLODE 中使数组动态化?

问题描述

我在表中有一堆学生记录。

school  stduent_id   start_date    end_date
111      123         2010-02-03   2012-02-03
222      345         2013-02-03   2014-02-03
222      567         2015-02-03   2018-02-03

我想计算每所学校每年有多少学生,比如从 2​​014 年一直到 2021 年。

目前,我使用横向视图,但它是硬编码的:

SELECT school,yrs,COUNT(disTINCT stduent_id) AS cnt
FROM TABLE
LAteraL VIEW EXPLODE(ARRAY(2014,2015,2016,2017,2018,2019,2020,2021))a AS yrs
WHERE 1=1
    AND YEAR(start_date) <= yrs
    AND YEAR(end_date) >= yrs

我希望它在年份移动时自动更新,例如,现在应该是 2014-2021,明年应该是 2015-2022。

知道我该怎么做吗?谢谢!

解决方法

您可以使用poseexplode生成年份范围:

with year_range as(--7 years back from current year till current year
select year(current_date)-7+i as yr
from ( select posexplode(split(space(7),' ')) as (i,x) 
) s
)

SELECT school,y.yr,COUNT(DISTINCT stduent_id) AS cnt
FROM TABLE
     CROSS JOIN year_range y
GROUP BY school,y.yr
WHERE 1=1
    AND YEAR(start_date) <= y.yr
    AND YEAR(end_date) >= y.yr       
,
SELECT school,yrs,COUNT(DISTINCT stduent_id) AS cnt
        FROM TABLE
        WHERE yrs 
        Between Year((DATEADD(YEAR,-7,GETDATE())))
        and
        Year(GETDATE())