【问题标题】:How do I determine the time at which the largest number of simultaneously events occurred?如何确定同时发生的事件数量最多的时间?
【发布时间】:2014-02-04 01:12:58
【问题描述】:

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

例如,给定这些事件:

  • 活动 1 从 5 点开始,持续 10 分钟
  • 活动 2 从 7 点开始,持续 4 分钟
  • 赛事 3 从 9 点开始,持续 2 场

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

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

【问题讨论】:

  • 如果您为您的桌子提供CREATE 和一些示例INSERT 可能会更好
  • 查看源数据中的列会很有用。我认为您将需要创建另一个表并构建某种计划的汇总流程,以获取一组适合您尝试创建的报告的新数据。
  • 计算出您的时间维度(秒?)...选择这个和一个计数,按您选择的相同时间维度分组,使用有或按计数排名前 1 位。如果不知道您的表格是什么样子,就不能做很多其他事情。
  • 可能的开始时间和持续时间如何量化?在您的示例中,所有开始时间和持续时间都是整数,这立即建议使用数字表。只要有一些最小量,这甚至可以在更精细的时间上工作。
  • 感谢您的反馈,伙计们。在编写任何代码之前我已经问过这个问题,所以实际上还没有模式 - 事实上,模式将部分地由任何方式决定,以便以这种方式访问​​数据。

标签: sql algorithm sorting


【解决方案1】:

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

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 查询中获得答案,而无需进行任何进一步的客户端处理。我也很欣赏这样的观察,即事件的峰值数量将是(杜松子酒)在事件的起点;我不确定为什么我没有想到这一点,但这将在其他地方有用。谢谢。
【解决方案2】:

1.将你所有的event beginevent end 时间放入一些结构中,例如:

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

将所有事件放入List<EventBeginOrEnd> myEventList 并对其进行排序

2.Hold几个柜台:

  • CurrentEventCount - 计算现在发生了多少事件。
  • MaxEventsCountSoFar - 统计迄今为止测量的一次最大事件数。
  • TheMaxTime - 测量最大值的时间。

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

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

MaxEventsCountSoFar=MaxEventsCountSoFar;
TheMaxTime=currentElement.time;

请注意,这允许您将浮点用于时间,而不仅仅是 int,因为您不是随时间迭代,而是随您拥有的事件迭代。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多