用Postgresql合并连续的行

前端之家收集整理的这篇文章主要介绍了用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小提琴.

猜你在找的Postgre SQL相关文章