sql - 如何确定同时发生的事件数量最多的时间?

标签 sql algorithm sorting

给定一个历史事件列表,每个事件都运行了一定秒数并且有一个非唯一的开始时间,我如何才能“最好地”确定发生最大事件数的时间范围? (在这种情况下,对于“最佳”,数据集存储在 SQL 数据库中,因此我可能正在寻找能够平衡少量查询与向客户端返回小数据集的东西;其中可能有数百个事件审查的时间间隔。)

例如,给定这些事件:

  • 事件 1 从 5 点开始,持续 10 点
  • 事件 2 从 7 点开始,持续 4 分钟
  • 事件 3 9 点开始,持续 2 分钟

大多数事件发生在时间 9-10,同时有 3 个事件发生。

想到的一种方法是遍历事件发生的整个时间间隔,并在每个点评估那里发生了多少事件,然后存储最大值;但肯定必须有一些更有效的方法。

最佳答案

由于“最大值”会在其中一个事件开始时发生,您可以进行自连接以查找当时正在进行的事件数:

SELECT TOP 1 MAX(e1.StartDate), COUNT(e2.eventID) FROM event e1
INNER JOIN event e2 
  on e1.StartDate BETWEEN e2.StartDate 
                      AND DATEADD(second,e2.Duration,e2.StartDate)
GROUP BY e1.EventID
ORDER BY COUNT(e2.eventID) DESC

关于sql - 如何确定同时发生的事件数量最多的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21532465/

相关文章:

sql - 从具有复合主键的另一个表插入或更新表

java - 我们如何在 O(n) 时间内实现 "substring-match"?

c++ - 为什么 HSV-to-RGB 算法会这样工作?

xcode 6 beta 6 sort() 似乎不像 Swift 文档所说的那样工作

linux - 唯一编号 : only when different by more than 1 character OR case

使用自定义交换的 C++ 排序实现?

mysql - Doctrine - 具有自定义主键的ManyToMany

mysql - 如何使用 SQL 查找不交叉的时间集?

mysql创建多个表

javascript - 如何只访问数组中的一对元素一次?