Импала: разбить одну строку на несколько строк на основе даты и времени - PullRequest
0 голосов
/ 24 марта 2020

Я хочу разбить одну строку на несколько строк в зависимости от времени.

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:00 до следующего дня 00:00 Когда EndDate время больше 00:00 (полночь), тогда разбейте эту дату на две строки. Дата окончания первой строки - 30.03.2020, 11:59:00, а начало следующей строки - 31 марта, 20:00, 00:00:00.

Пожалуйста, помогите мне решить это.

1 Ответ

2 голосов
/ 25 марта 2020

Это было бы хорошим местом для рекурсивного 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

Вы можете расширить подзапрос для обработки большего количества возможных периодов в строке.

Также обратите внимание, что это создает полуоткрытые интервалы, где конец предыдущего интервала равен началу следующего (в то время как в вашем наборе результатов есть задержка в одну минуту). Логика c заключается в том, что интервал включается в его меньшую границу и исключает внешнюю границу (таким образом, вы не должны оставлять никаких пробелов).

...