如何在postgresql中获得最大并发事件数?

saz*_*ary 3 sql postgresql timespan

我有一个events像这样命名的表:

id: int
source_id: int
start_datetime: timestamp
end_datetime: timestamp  
Run Code Online (Sandbox Code Playgroud)

这些事件可能有重叠,我想知道在一段时间内发生的重叠事件的最大数量。例如,在这样的情况下:

id | source_id | start_datetime     | end_datetime
----------------------------------------------------------
1  | 23        | 2017-1-1T10:20:00  | 2017-1-1T10:40:00
1  | 42        | 2017-1-1T10:30:00  | 2017-1-1T10:35:00
1  | 11        | 2017-1-1T10:37:00  | 2017-1-1T10:50:00  
Run Code Online (Sandbox Code Playgroud)

答案是 2,因为最多 2 个事件在 10:30 到 10:35 重叠。
我正在使用 Postgres 9.6

Gor*_*off 6

这是一个想法:计算启动次数并减去停止次数。这给出了每次的净金额。剩下的只是聚合:

with e as (
      select start_datetime as dte, 1 as inc
      from events
      union all
      select end_datetime as dte, -1 as inc
      from events
     )
select max(concurrent)
from (select dte, sum(sum(inc)) over (order by dte) as concurrent
      from e
      group by dte
     ) e;
Run Code Online (Sandbox Code Playgroud)

子查询显示每次重叠事件的数量。

您可以将时间范围设为:

select dte, next_dte, concurrent
from (select dte, sum(sum(inc)) over (order by dte) as concurrent,
             lead(dte) over (partition by dte) as next_dte
      from e
      group by dte
     ) e
order by concurrent desc
fetch first 1 row only;
Run Code Online (Sandbox Code Playgroud)