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

时间:2014-02-03 16:26:42

标签: sql algorithm sorting

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

例如,鉴于这些事件:

  • 事件1从5开始,运行10
  • 事件2从7开始,运行4
  • 事件3从9开始,运行2

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

我想到的一种方法是迭代事件发生的整个时间间隔,并在每个点评估那里发生的事件数量,然后存储最大值;但肯定有一些更有效的方法。

2 个答案:

答案 0 :(得分:1)

由于当其中一个事件开始时会出现“max”,您可以进行自我联接以查找当时正在进行的事件的数量:

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

答案 1 :(得分:0)

1.取你所有的event beginevent end次,然后输入一些结构:

struct EventBeginOrEnd
{
bool begin; // True if event begin, false if end
int time;
}

将所有事件放在List<EventBeginOrEnd> myEventList排序中。

2.少数柜台:

  • CurrentEventCount - 计算现在发生的事件数量。
  • MaxEventsCountSoFar - 计算到目前为止一次测量的最大事件数。
  • TheMaxTime - 测量最大值的时间。

3.iterate over myEventList并在每个元素中检查他是开始还是结束,如果开始增加CurrentEventCount否则减少。

4.当CurrentEventCount更大时,MaxEventsCountSoFar更新如下:

MaxEventsCountSoFar=MaxEventsCountSoFar;
TheMaxTime=currentElement.time;

请注意,这允许您使用浮点时间而不仅仅是int,因为您不会随着时间的推移而是通过您拥有的事件进行迭代。

由于排序,复杂性为O(n*Log(n))