【发布时间】:2019-12-06 13:19:16
【问题描述】:
我在 hive 表中的数据如下所示,其中 id 、 start_time 和 end_time 作为字符串
id start_time end_time
101 10:00 12:00
101 10:15 12:30
101 12:15 12:45
101 13:00 14:00
102 10:15 10:30
我想创建一个新字段 group_id 来标识每个“id”中具有重叠 start_time 和 end_time 间隔的记录。 期望的输出是:
id start_time end_time group_id
101 10:00 12:00 1
101 10:15 12:30 1
101 12:15 12:45 1
101 13:00 14:00 2
102 10:15 10:30 3
例如:在 101 内,第 1 3 条记录重叠: 第 2 次与第 1 次重叠,因为 10:15(第 2 次的开始时间)在 10:00 和 12:00(第 1 次的开始和结束时间)之间。 第 3 次与第 2 次重叠,因为 12:15(第 3 次的开始时间)在 10:15 和 12:30(第 2 次的开始和结束时间)之间。 第 4 条记录不重叠,因此被分配下一个组 ID (2)。 最后一条记录具有不同的 id 并且单独在组中,因此它被赋予下一个 id (3)
我尝试将一条记录与之前的记录进行比较,以检查它是否使用滞后函数重叠:
select id, start_time,end_time,
case when rownum_per_id = 1 THEN 'TRUE'
when start_time between lag(start_time,1) over w and lag(end_time,1) over w THEN 'TRUE'
ELSE 'FALSE' END as overlap_ind
from
(select id,start_time,end_time,
row_number() over(partition by id order by start_time) as rownum_per_id
from (select id,
from_unixtime(unix_timestamp(start_time,"HH:mm")) as start_time,
from_unixtime(unix_timestamp(end_time,"HH:mm")) as end_time
from test_table
) a
) b
window w as (partition by id order by start_time)
得到输出为:
id start_time end_time overlap_ind
101 1970-01-01 10:00:00 1970-01-01 12:00:00 TRUE
101 1970-01-01 10:15:00 1970-01-01 12:30:00 TRUE
101 1970-01-01 12:15:00 1970-01-01 12:45:00 TRUE
101 1970-01-01 13:00:00 1970-01-01 14:00:00 FALSE
102 1970-01-01 10:15:00 1970-01-01 10:30:00 TRUE
但无法弄清楚下一步如何分配递增的 group_id
【问题讨论】: