我有一个这样的插槽表:
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;