我有一张包含紧急事件相关数据的表格。我想比较多少事件重叠(按时间)。我知道数据库本质上是无序的,但我有事件的开始(和结束)时间,所以我可以按时间订购记录。
我认为最终结果将是一个结果集,其中包含每条记录和一个额外的字段,表明它是否与任何事件重叠(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)
答案 0 :(得分:1)
我的英语非常糟糕,所以我不完全理解你的问题
如果这是我的想法,你可以在sql中使用group by http://www.w3schools.com/sql/sql_groupby.asp
select incident, count(*)
from your table
group by incident
另外,如果您有日期,则可以将此查询指定为日期范围
select incident, count(*)
from your table
where startDate >= @startDate and endDate <= @finishDate
group by incident
仅当您想在两个日期之间执行此操作时
抱歉英语不好,如果这不是你想要的话,对不起!答案 1 :(得分:1)
如果我理解了您的问题,并为列Id
,StartDate
和EndDate
的事件假设一个简单的表格,您可以找到每个事件的重叠次数带有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