Impala:根据日期和时间将单行拆分为多行

时间:2020-03-24 14:55:31

标签: sql hadoop hive cloudera impala

我想根据时间将单行分成多行。

SrNo    Employee       StartDate                  EndDate
---------------------------------------------------------------------------
1         emp1      30/03/2020 09:00:00        31/03/2020 07:15:00  
2         emp2      01/04/2020 09:00:00        02/04/2020 08:00:00

预期的输出如下:

SrNo    Employee       StartDate                  EndDate
---------------------------------------------------------------------------
1         emp1      30/03/2020 09:00:00        30/03/2020 11:59:00   
1         emp1      31/03/2020 00:00:00        31/03/2020 07:15:00  
2         emp2      01/04/2020 09:00:00        01/04/2020 11:59:00  
2         emp2      02/04/2020 00:00:00        02/04/2020 08:00:00

每天从00:00 AM开始到第二天00:00 AM。如果EndDate时间大于00:00 AM(午夜),则将此日期分为两行。第一行结束日期是30/03/2020 11:59:00,下一行开始日期31/03/2020 00:00:00。

请帮助我解决。

1 个答案:

答案 0 :(得分:2)

这将是递归CTE的好地方,但不幸的是Hive不支持这些。这是另一个方法,它使用派生的数字表分割句点:

select
    t.SrNo,
    t.Employee,
    greatest(t.startDate, date_add(to_date(t.startDate), x.n)) startDate,
    least(t.endDate, date_add(to_date(t.startDate), x.n + 1)) endDate
from mytable t
inner join (select 0 n union all select 1 union all select 2) x
    on date_add(to_date(t.startDate), x.n) <= t.endDate

您可以展开子查询以处理每行更多的可能时间段。

还请注意,这会生成半开间隔,其中前一个间隔的末尾等于下一个间隔的开始(而在结果集中有一分钟的滞后)。逻辑是,间隔在其较小范围内是包含性的,而在外部范围上是互斥的(这样,您确保不留任何间隙)。

相关问题