我有这样一张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小提琴.
| 归档时间: |
|
| 查看次数: |
1103 次 |
| 最近记录: |