1

我有一张包含与紧急事件相关的数据的表格。我希望比较有多少事件重叠(按时间)。我知道数据库本质上是无序的,但我有事件的开始(和结束)时间,所以我可以按时间对记录进行排序。

我认为最终结果将是一个包含每条记录和一个额外字段的结果集,该字段指示它是否与任何事件重叠(0 表示没有事件,1 表示一个重叠,2 表示两个重叠......)。从历史上看,重叠的数量是有限的(6 是当前的最大值),但可能会有更多。

目前,我在 Excel 中进行此类分析,使用辅助列将当前记录与以前的记录进行比较,以确定是否存在重叠(或重叠数量)并且工作正常,但似乎我应该能够完成这个严格在 SQL 内。

编辑:这是来自 Excel 的示例,但数据保存在单个 SQL 表中。我拥有数据库的管理员权限,因此我几乎可以实施任何解决方案——除了更改数据库结构(它是一个 COTS 系统)。我已经包含了重叠列的公式。此外,我在 2 个重叠处停止了示例公式,但是当我实现答案时,我会考虑更多。

Incident    Start               End          Overlap    Overlap Formula
    1   2012-01-01 07:00    2012-01-01 08:00        
    2   2012-01-02 07:00    2012-01-02 08:00    0   =IF(C2>B3,1,0)
    3   2012-01-02 07:30    2012-01-02 08:30    1   =IF(C3>B4,IF(C2>B4,2,1),0)
    4   2012-01-03 07:00    2012-01-03 08:00    0   =IF(C4>B5,IF(C3>B5,2,1),0)
    5   2012-01-04 07:00    2012-01-04 08:00    0   =IF(C5>B6,IF(C4>B6,2,1),0)
    6   2012-01-04 07:30    2012-01-04 08:30    1   =IF(C6>B7,IF(C5>B7,2,1),0)
    7   2012-01-04 07:45    2012-01-04 08:45    2   =IF(C7>B8,IF(C6>B8,2,1),0)
    8   2012-01-04 08:45    2012-01-04 09:45    0   =IF(C8>B9,IF(C7>B9,2,1),0)
    9   2012-01-05 07:00    2012-01-05 08:00    0   =IF(C9>B10,IF(C8>B10,2,1),0)
4

2 回答 2

1

我的英语很差,所以我不完全理解你的问题

如果这是我的想法,您可以在 sql http://www.w3schools.com/sql/sql_groupby.asp中使用 group by

select incident, count(*)
from your table
group by incident

此外,如果您有日期,则可以将此查询指定为日期范围

select incident, count(*)
from your table
where startDate >= @startDate  and endDate <= @finishDate
group by incident

仅当您想在两个日期之间执行此操作时

对不起英语不好,如果这不是你想要的,对不起!

于 2012-06-06T13:01:18.393 回答
1

如果我理解了您的问题,并假设您的事件有一个简单的表,其中包含Id, StartDateEndDate那么您可以使用带有 的子查询找到每个事件的重叠数APPLY,例如:

SELECT I.Id, O.Overlaps
FROM Incidents I
CROSS APPLY (
    SELECT COUNT(*) AS Overlaps
    FROM Incidents C
    WHERE C.Id <> I.Id
    AND  (C.StartDate BETWEEN I.StartDate AND I.EndDate OR
          C.EndDate BETWEEN I.StartDate AND I.EndDate)
) O
于 2012-06-06T13:07:05.903 回答