假设您有一个包含标识符、开始时间和结束时间的表。这些开始和结束时间可以是任意时间长度。开始时间始终早于结束时间。假设没有空值。
什么样的查询会告诉我最“流行”的时间,即每行中的两个范围与大多数其他行重叠的位置?
它的实际应用是它是一个记录用户登录和注销时间的表。我想编写一个查询来告诉我最多并发用户登录的时间,并查看这是多长时间。
谢谢。
有几种方法可以实现这一点。一种使用相关子查询。那可不是什么有趣的事。相反,我们使用累积和方法,因为您有 Oracle。
关键是从时间戳列表开始,+1 表示开始,-1 表示结束。这很容易:
select t.*
from ((select starttime as thetime, 1 as value from table t) union all
(select endtime, -1 as value from table t)
) t
现在,累计总和为value
告诉您在任何给定时间的活动重叠数:
select t.*, sum(value) over (order by thetime) as numactives
from ((select starttime as thetime, 1 as value from table t) union all
(select endtime, -1 as value from table t)
) t
这解决了你的问题。您可能想添加一个order by numactives desc
对于具体时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)