В Hive есть хитрость для генерации серии чисел - и их можно затем превратить в даты. Это боль, но есть хитрость, использующая space()
и posexplode()
- которая адаптирована из здесь .
Я не уверен, что синтаксис правильный на 100% , но как то так:
with hh as (
select unix_timestamp(min(start_time)) + (n - 1) * 60*60 as hh_start,
unix_timestamp(min(start_time)) + n * 60*60 as hh_end
from (select unix_timestamp(min(start_time)) as min_st,
floor((unix_timestamp(max(end_time)) - unix_timestamp(min(start_time))) / (60 * 60)) as num_hours
from t
) x lateral view
posexplode(split(space(num_hours + 1), ' ')) pe as n, x
)
select hh.hh_start, count(t.id)
from hh left join
t
on t.start_time < hh.hh_end and
t.end_time >= hh.hh_start
group by hh.hh_start
order by h.hh_start;