2012-06-06 52 views
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) 
+0

你能展示幾行樣本數據和期望的結果嗎?然後,我們可以構造一個有用的答案,而不是在模式/數據處進行猜測,併爲您提供諸如foo和bar之類的表和列名稱的查詢。同時發佈您的Excel功能可能對您確切地瞭解您的工作非常有用。 –

+0

我現在離開了我的辦公桌,但當我回來時會添加一些數據。 Thx – dav

回答

1

如果我明白你的questiion,並假設你用事件列StartDateId,一個簡單的表格,並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 
+0

這很好,謝謝!我將不得不使用Apply函數仔細觀察子查詢 - 我不確定我完全理解它是如何工作的,但它給了我正確的答案。 – dav

+1

沒問題! APPLY非常方便;它爲您提供了一種爲主查詢的每一行執行表值函數的方法。因此,在這裏,計算重疊計數的查詢將應用於事件表中的每一行。這就像一個更靈活/強大的JOIN – Bort

1

我的英語很糟糕,所以我不完全理解你的問題

,如果它是什麼,我想,你可以在SQL 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 

只有當你想兩個日期

遺憾的英語不好,和對不起,如果這是不是你想要的東西之間做到這一點!