java - 根据 timeStart 和 timeEnd 值选择最大并发记录数

标签 java sql oracle

我在 Oracle 服务器中有一个 SQL 表,其中包含事件的开始时间和结束时间值,并且希望通过 SQL 查询了解同一秒内发生的并发事件的最大数量(如果可能)。

我的表结构是:

EventID    StartTime   EndTime
===================================
12345      10:25:50    10:25:59
12346      10:25:51    10:26:00
12347      10:25:55    10:26:10

我尝试进行查询,选择小时、分钟和秒作为单独的字段,并按它们对记录进行分组,但由于我有时间范围,所以我不知道如何检查它们何时重叠(因为它们是同时执行的,如果他们有重叠的时间)。

如果不可能作为查询,您能给我推荐一种在 Java 中计算此数据的有效方法吗?我可以通过循环 ResultSet 想到一种方法,但不知道如何排列重叠事件。

最佳答案

创建一个包含增量的所有时间的列表 - 事件开始时 +1,事件结束时 -1。

然后用累加求和得到任意时刻的总活跃度并拉取最大值:

with times as (
      select starttime as t, +1 as inc
      from structure
      union all
      select endtime, -1
      from structure
     )
select t.*
from (select t, sum(inc) over (order by t) as actives
      from (select t, sum(inc) as inc
            from times
            group by t
           ) t
      order by actives desc
    ) t
where rownum = 1;

最里面的子查询(带有group by)只是为了处理同时发生的事情。

关于java - 根据 timeStart 和 timeEnd 值选择最大并发记录数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30518352/

相关文章:

java - 按索引从周期序列 0,1,2,3,2,1,0,1... 获取值的最简单方法是什么?

c# - Microsoft OracleClient迁移到ODP.NET时报错 "ORA-03135: Connection lost contact"是什么原因

java - 在数据库中存储 XML 数据 - 许多表与在列中转储 xml

来自 android 的 java.lang.classcastException android.widget.textview 错误但我不知道如何

java - Kafka - 如何检查消费者是否还活着,如果不是,如何将消费者恢复到运行状态?

java - 从按钮调用java类

SQL:如何在一个查询中编写多个交互式脚本(插入行)

mysql - 如何打印结果集中的值而不包含列中的任何重复记录

mysql - SQL : Using the target table in an UPDATE statement in a nested FROM clause

Java Oracle 连接池 - 关闭连接异常