数据挑战-Postgres SQL-对事件进行编号

时间:2018-07-24 07:43:39

标签: sql postgresql

我有一个数据集,我想在其中生成一个结合了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

1 个答案:

答案 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

DBFiddle DEMO

该解决方案假定一个firstid的间隔不重叠!