配置单元中给定记录集的最小和最大日期

vhipe2zx  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(283)

所有,我有一个要求,以获得最低和最高日期在Hive的一套记录。我的数据看起来像这样。

Key    start_date    end_date
----   ----------    ---------      
111    01-01-2017    06-30-2017
111    07-01-2017    07-31-2017
111    09-01-2017    09-30-2017
111    10-01-2017    10-20-2017
111    11-01-2017    11-30-2017

我所期望的是

key   start_date    end_date
---   ---------     --------
111   01-01-2017    07-31-2017
111   09-01-2017    10-20-2017
111   11-01-2017    11-30-2017

基本上,每当有一个突破的日期范围,我需要写一个新的记录。
我试图获取结束日期和开始日期之间的日期差,如果它大于1,我将把它标记为一个新记录。但是,我不确定在这之后如何分割记录。任何帮助或指导都将不胜感激。
预期结果

key   start_date    end_date
111   01-01-2017    07-31-2017
111   09-01-2017    10-20-2017
111   11-01-2017    11-30-2017
zz2j4svz

zz2j4svz1#

这是一种缺口和孤岛问题。你需要确定“孤岛”存在的地方。假设时间段是相邻的(如您的示例中所示),您可以使用 join 或者 exists :

select key, min(start_date), max(end_date)
from (select t.*,
             sum(case when tprev.key is null then 1 else 0 end) over (partition by t.key order by t.start_date) as grp
      from t left join
           t tprev
           on tprev.key = t.key and
              tprev.end_date = date_add(t.start_date, -1)
     ) t
group by key, grp;

可以调整此逻辑以处理重叠,但您的数据似乎不需要这样做。

相关问题