Sql 按非固定时间间隔进行查询分组
我想按移动、非固定的时间间隔分组。 也就是说,我有一些事件有开始和结束,我想计算一下有多少事件同时发生 我有一张这样的桌子Sql 按非固定时间间隔进行查询分组,sql,postgresql,Sql,Postgresql,我想按移动、非固定的时间间隔分组。 也就是说,我有一些事件有开始和结束,我想计算一下有多少事件同时发生 我有一张这样的桌子 start | end | desc ----------------------------------------------------------- '2018-03-29 13:36:52'|'2018-03-29 13:37:52+02'|'Alarm_821' '2018-03-29 13
start | end | desc
-----------------------------------------------------------
'2018-03-29 13:36:52'|'2018-03-29 13:37:52+02'|'Alarm_821'
'2018-03-29 13:39:52'|'2018-03-29 13:41:52+02'|'Alarm_821'
'2018-03-29 15:44:15'|'2018-03-29 15:50:16+02'|'Alarm_819'
'2018-03-29 15:44:15'|'2018-03-29 15:51:16+02'|'Alarm_817'
'2018-03-29 16:08:18'|'2018-03-29 16:10:19+02'|'Alarm_418'
'2018-03-29 16:08:18'|'2018-03-29 16:10:19+02'|'Alarm_465'
'2018-03-29 16:11:19'|'2018-03-29 16:15:19+02'|'Alarm_418'
我想得到这个结果:
start | end | count
-----------------------------------------------------------
'2018-03-29 13:36:52'|'2018-03-29 13:37:52+02'| 1
'2018-03-29 13:39:52'|'2018-03-29 13:41:52+02'| 1
'2018-03-29 15:44:15'|'2018-03-29 15:50:16+02'| 2
'2018-03-29 15:50:16'|'2018-03-29 15:51:16+02'| 1 <<== here start refers to the end of the first event ending when both of them started
'2018-03-29 16:08:18'|'2018-03-29 16:10:19+02'| 2
'2018-03-29 16:11:19'|'2018-03-29 16:15:19+02'| 1
实际上,我不确定仅使用SQL是否可以做到这一点。下面是一个基于表中所有时间的并集的解决方案。它从该列表中创建相邻对,然后搜索间隔重叠
select t.st, t.en, count(*)
from
(
select lag(tm) over (order by tm) st, tm en
from
(
select "start" tm from data
union
select "end" tm from data
) r
) t
join data on t.st < data."end" and t.en > data."start"
group by t.st, t.en
order by t.st
如果我想在中间插入0个计数呢?我的意思是,如果我有一个从16:03到17:03的间隔,另一个从18:45到19:00的间隔,我希望有一个从17:03到18:45的一行,计数为0,我设法这样获得它,但是它非常麻烦@balsick,那么左边的连接呢?谢谢,您的查询看起来更好,结果看起来更可靠