【问题标题】:How do I make array dynamic in LATERAL VIEW EXPLODE?如何在 LATERAL VIEW EXPLODE 中使数组动态化?
【发布时间】:2021-05-19 00:08:39
【问题描述】:

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

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。

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

【问题讨论】:

    标签: sql dynamic hive hiveql lateral-join


    【解决方案1】:

    您可以使用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       
    

    【讨论】:

      【解决方案2】:
      SELECT school, yrs, COUNT(DISTINCT stduent_id) AS cnt
              FROM TABLE
              WHERE yrs 
              Between Year((DATEADD(YEAR,-7,GETDATE())))
              and
              Year(GETDATE())
      

      【讨论】:

      • 虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并最终将这些知识应用到他们自己的代码中。解释代码时,您也可能会得到用户的积极反馈/赞成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 2019-10-03
      相关资源
      最近更新 更多