作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个名为 events
的表,如下所示:
id: int
source_id: int
start_datetime: timestamp
end_datetime: timestamp
这些事件可能有重叠,我想知道在一段时间内发生的重叠事件的最大数量。例如,在这样的情况下:
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
答案是 2,因为最多有 2 个事件在 10:30 到 10:35 重叠。
我正在使用 Postgres 9.6
最佳答案
思路如下:计算开始的次数并减去停止的次数。这给出了每次的 Netty 。剩下的只是聚合:
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;
子查询显示每次重叠事件的数量。
您可以获得时间范围:
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;
关于sql - 如何在postgresql中获取最大并发事件数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46908045/
我是一名优秀的程序员,十分优秀!