java - Oracle SQL - 计算并发事件数

标签 java sql oracle

我正在尝试找出一种方法来识别表中的事件记录何时同时发生。

例如,假设我在 Oracle 数据库中有一个名为 EVENTS 的表::

|EVENT_UUID|HOST_NAME|START_TM|END_TM|

|1|host1|12-JUN-15 01.31.04.092000000 PM|12-JUN-15 01.55.58.716000000 PM|
|2|host2|15-JUN-15 10.02.45.494000000 AM|15-JUN-15 01.12.18.257000000 PM|
|3|host3|17-JUN-15 03.19.48.506000000 PM|17-JUN-15 03.51.59.874000000 PM|
|4|host4|18-JUN-15 09.24.36.602000000 PM|NULL|
|5|host5|18-JUN-15 12.32.43.109000000 PM|19-JUN-15 01.22.32.412000000 PM|

我知道我可以通过执行以下操作找到在给定日期范围内开始的所有事件::

SELECT *
FROM EVENTS
WHERE START_TM BETWEEN TO_DATE('2015-JUN-11', 'YYYY-MON-DD') AND TO_DATE('2015-JUN-13', 'YYYY-MON-DD');

但这只会给我所有在该范围内开始的事件。

最终,我希望能够运行报告并检查如下内容,

  • “一天内发生的并发事件数。”
  • “一小时内发生的并发事件数。”

有人知道可以帮助我确定事件何时同时发生的方法吗?

最佳答案

您可以使用一种相对简单的技术来计算并发事件数:累积聚合。这个想法是计算开始和停止的次数。那么累计数就是并发值的个数。

select tm, sum(isstart) as numstarts, sum(isstop) as numstops,
       (sum(sum(isstart)) over (order by tm nulls last) -
        sum(sum(isstop)) over (order by tm nulls last)
       ) as NumConcurrent
from ((select start_tm as tm, 1 as isstart, 0 as isstop from events
      ) union all
      (select stop_tm, 0 as isstart, 1 as isstop from events
      )
     ) e
group by tm;

这会为您提供数据中每次并发事件的数量(开始时间或结束时间。然后您可以使用 where 子句和 order by/fetch first 或聚合。

关于java - Oracle SQL - 计算并发事件数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33681560/

相关文章:

mysql - 每个属性值的 SQL 最大值

sql - Oracle Apex 5 错误,ORA-00907 : missing right parenthesis. 看不到缺少的括号?

java - Tomcat,Oracle 数据库 11gR2 的登录被拒绝

java - 覆盖 paint 或 paintComponent 时需要恢复图形原始状态

java - 从 URL 中提取数据以用于 selenium 测试

mysql - if else 上使用 mysql 的 sql

java - 对一段时间内的每一天做一个查询,把它变成一个查询

sql - 如何利用SQL(Oracle)来计算字符串的大小?

java - 将 Java 控制台置于屏幕前面

java - (Java)统计程序