比较表中的数据

时间:2012-06-06 12:37:42

标签: tsql datetime sql-server-2008-r2

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

我认为最终结果将是一个结果集,其中包含每条记录和一个额外的字段,表明它是否与任何事件重叠(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)

2 个答案:

答案 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)

如果我理解了您的问题,并为列IdStartDateEndDate的事件假设一个简单的表格,您可以找到每个事件的重叠次数带有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