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

Java 根据timeStart和timeEnd值选择最大并发记录数,java,sql,oracle,Java,Sql,Oracle,我在Oracle server中有一个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

我在Oracle server中有一个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计算这些数据的有效方法吗?我可以通过循环结果集想出一种方法,但不知道如何确切地排列重叠的事件。

创建一个包含所有时间的列表,增量为事件开始时+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
)只是处理恰好同时发生的事情。

您使用的是哪种RDBMS?似乎您应该能够对按StartTime排序的行使用LAG函数,并查看下一个开始时间是否早于上一个开始时间+(endTime StartTime)不确定LAG在这里是否有效,因为它们是独立但重叠的记录?(它被标记为Oracle)重叠记录是指在同一秒发生的记录,即使它们的开始和结束时间不一样。EX:在样本表中,我提出了三个记录重叠的原因,因为它们都是从<>代码> 10:25:55 <代码>到<>代码> 10:25:59 如果你有一个记录,从10:25:50到10:25:51,一个从10:25:51到10:25:52,你会认为那些是重叠的吗?两者都包括第二个51,如果你把它看作是包容的,但你可能不这样。在我的例子中,我考虑边界包括在内。因此,在您的示例中,两条记录将重叠。您的查询工作得非常好。谢谢它甚至可以避免使用太多特定于oracle的内容syntax@RobertoLinares . . . 也应该比其他答案表现得更好。很好(现在我已经知道它在做什么了*8-)。但它不会捕捉到周期重叠一秒钟(]);我猜那一刻的正反两面会相互抵消吗?。。。假设这被认为是一个重叠,但可能不是。也完全同意性能方面。@Alex。OP需要定义当时间相同时在边界情况下发生的情况。
package test3;

import java.util.Scanner;

public class maximumnumbercheck {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
int a,b;

        System.out.println("Enter A Value");
Scanner max=new Scanner(System.in);
a=max.nextInt();
System.out.println("Enter B Value");
b=max.nextInt();


max.close();


String msg=(a>=b)? "  A is Maximum NUmber " :"  b Is Maximum Number";
System.out.println("msg  "+msg);
    }

}