Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按非固定时间间隔进行查询分组_Sql_Postgresql - Fatal编程技术网

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,那么左边的连接呢?谢谢,您的查询看起来更好,结果看起来更可靠