用Postgresql合并连续的行

我有一个这样的插槽表:
Column   |            Type             |
------------+-----------------------------+
 id         | integer                     |
 begin_at   | timestamp without time zone |
 end_at     | timestamp without time zone |
 user_id    | integer                     |

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

(1,5:15,5:30,1)
(2,2)
(3,5:45,2)
(4,6:00,2)
(5,8:15,8:30,2)
(6,8:45,2)

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

(5:15,1)
(5:15,2) // <======= rows id 2,3 and 4 merged
(8:15,2) // <======= rows id 5 and 6 merged

编辑:
这是SQLfiddle

我使用Postgresql 9.3版本!

谢谢!

这是解决这个问题的一种方法.创建一个标志,确定一条记录是否与上一条记录不重叠.这是一个小组的开始.然后取这个标志的累积和,并将其用于分组:
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;

Here是一个SQL小提琴.

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...