Sql 配置单元窗口功能:将组id分配给重叠组

Sql 配置单元窗口功能:将组id分配给重叠组,sql,hive,hiveql,Sql,Hive,Hiveql,我在配置单元表中的数据如下所示,id、开始时间和结束时间为字符串 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 我想创建一个新的字段组id,它标识每个“id”中具有重叠的开始时间和结束时间间隔的记录。 期望输出为: id start_time

我在配置单元表中的数据如下所示,id、开始时间和结束时间为字符串

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
我想创建一个新的字段组id,它标识每个“id”中具有重叠的开始时间和结束时间间隔的记录。 期望输出为:

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
对于eg:101,前3条记录重叠: 由于10:15(开始时间为2秒)介于10:00和12:00(开始时间和结束时间为1秒)之间,2秒与1秒重叠。 第3次与第2次重叠,因为12:15(第3次的开始时间)介于10:15和12:30之间(第2次的开始和结束时间)。 第四条记录不重叠,因此分配给下一个组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

但是,由于无法确定分配递增组id的下一步操作,您可以使用字符串操作来完成此操作。一种方法是计算每次之前的累计最大值。使用该信息确定组开始的时间,然后确定累积总和:

select t.*,
       sum(case when prev_end_time >= start_time then 0
                else 1 end) over (partition by id order by start_time) as group_id
from (select t.*,
             max(end_time) over (partition by id order by start_time rows between unbounded preceding and 1 preceding) as prev_end_time
      from finance_acturl_data_smith.test_table t
     ) t;
编辑:

上面为每个用户生成一个单独的
组id
。我们可以通过删除
分区来调整这一点:

select t.*,
       sum(case when prev_end_time >= start_time then 0
                else 1 end) over (order by id, start_time) as group_id
from (select t.*,
             max(end_time) over (partition by id order by start_time rows between unbounded preceding and 1 preceding) as prev_end_time
      from finance_acturl_data_smith.test_table t
     ) t;

这是因为第一个按
划分的
分区仍然用于定义
prev_end_time
,因此每个
id
的第一个值都是
NULL
,并转到
else

内部查询在配置单元中给出语法错误:WindowFrame的SemanticException end不能是无界的(state=42000,code=40000)@Shanil…这不仅是标准SQL,而且配置单元也明确支持它:。