我有一个数据集,我想在其中生成一个结合了timeupfollowing事件的新id。因此,如果一行的结束时间与下一个开始时间相同,并且firstid是相同的,并且firstid跟在最后一行之后,则应该为两者生成相同的“ newid”。我在这里取了一小部分数据:
firstid secondid starttime endtime stage
13123 010 2017-10-15 11:31:16 2017-10-15 11:36:34 1
13123 011 2017-10-15 11:36:34 2017-10-15 11:45:31 2
13123 021 2017-10-16 09:15:16 2017-10-16 09:55:43 1
13123 022 2017-10-16 09:55:43 2017-10-16 10:45:31 2
20314 010 2017-10-18 17:24:16 2017-10-18 17:46:34 1
20314 011 2017-10-18 17:46:34 2017-10-18 18:10:31 2
我想将其转换为:
firstid secondid starttime endtime stage newid
13123 010 2017-10-15 11:31:16 2017-10-15 11:36:34 1 1
13123 011 2017-10-15 11:36:34 2017-10-15 11:45:31 2 1
13123 021 2017-10-16 09:15:16 2017-10-16 09:55:43 1 2
13123 022 2017-10-16 09:55:43 2017-10-16 10:45:31 2 2
20314 010 2017-10-18 17:24:16 2017-10-18 17:46:34 1 3
20314 011 2017-10-18 17:46:34 2017-10-18 18:10:31 2 3
似乎可行,但无法完成。有人可以帮我吗?
编辑1;认为我明白了;舍入第二个id组成一个新列,然后按该新列分组!现在测试。
编辑2;解决方案不起作用;发现秒号并不像我想的那样合理。其中的结构如下:
13123 010 2017-10-15 11:31:16 2017-10-15 11:36:34 1
13123 011 2017-10-15 11:36:34 2017-10-15 11:45:31 2
13123 012 2017-10-16 09:15:16 2017-10-16 09:55:43 1
13123 021 2017-10-16 09:55:43 2017-10-16 10:45:31 2
答案 0 :(得分:0)
您可以尝试以下方法:
with borders as (
select case when lag(endtime) over (partition by firstid order by starttime) = starttime then 0 else 1 end sep, *
from data
),
dataRn as
(
select row_number() over (partition by firstid, sep order by starttime) grNo,
*
from borders
where sep = 1
)
select *
from
(
select firstid, secondid, starttime, endtime, grNo
from dataRn
union all
select firstid, secondid, starttime, endtime,
(select max(grno) from dataRn t2 where t2.firstid = t1.firstid and t2.endtime <= t1.starttime) grno
from borders t1
where sep = 0
) t
order by firstid, starttime
该解决方案假定一个firstid
的间隔不重叠!