使用Postgresql合并连续行

Mat*_*ahé 11 sql postgresql

我有这样一张slots桌子:

   Column   |            Type             |
------------+-----------------------------+
 id         | integer                     |
 begin_at   | timestamp without time zone |
 end_at     | timestamp without time zone |
 user_id    | integer                     |
Run Code Online (Sandbox Code Playgroud)

我喜欢连续时间选择合并的行.假设我有(简化)数据,如:

(1, 5:15, 5:30, 1)
(2, 5:15, 5:30, 2)
(3, 5:30, 5:45, 2)
(4, 5:45, 6:00, 2)
(5, 8:15, 8:30, 2)
(6, 8:30, 8:45, 2)
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以选择格式如下的行:

(5:15, 5:30, 1)
(5:15, 6:00, 2) // <======= rows id 2,3 and 4 merged
(8:15, 8:45, 2) // <======= rows id 5 and 6 merged
Run Code Online (Sandbox Code Playgroud)

编辑: 这是SQLfiddle

我正在使用Postgresql,版本9.3!

谢谢!

Gor*_*off 12

这是解决此问题的一种方法.创建确定是否一个记录并标记与前一个重叠.这是一个小组的开始.然后获取此标志的累积总和并将其用于分组:

select user_id, min(begin_at) as begin_at, max(end_at) as end_at
from (select s.*, sum(startflag) over (partition by user_id order by begin_at) as grp
      from (select s.*,
                   (case when lag(end_at) over (partition by user_id order by begin_at) >= begin_at
                         then 0 else 1
                    end) as startflag
            from slots s
           ) s
     ) s
group by user_id, grp;
Run Code Online (Sandbox Code Playgroud)

是一个SQL小提琴.