2016-05-04 19 views
2

時間重疊我想開始時間重疊的計數的DocID如何找到在MSSQL

在下面的例子9:00-9:15在重疊9:00-9:30 所以我想要的DocID(111)計數爲2

============================================================= 
EncID | Pid | DocID | Date  | StartTime | EndTime| 
============================================================= 
1  | 11 | 111 | 25/3/2016 | 9:00  | 9:30 |  
2  | 12 | 111 | 25/3/2016 | 9:00  | 9:15 |  
3  | 13 | 111 | 26/3/2016 | 10:00  | 10:30 |  
============================================================= 





Expected Out put 
============== 
DocID | count| 
============== 
111 | 2 | 
============== 
+0

自我加入表上a.DocID = B.DocID WHERE Min(A.StartTime)<= Min(B.StartTime)AND Max(A.EndTime)> = MAX(B.EndTime) – EastOfJupiter

+0

我忘了包含在DATE加入。我假設你想要日期和時間重疊,而不僅僅是時間。 I.E.兩個間隔正好相隔24小時的開始和結束時間重疊的記錄不應包含在計數中。 – EastOfJupiter

回答

1

像這樣的東西應該工作,避免OR。子查詢應該高效運行。

SELECT 
    T1.DocID, 
    (
     SELECT COUNT(*) 
     FROM [Table] T2 
     WHERE T1.DocID = T2.DocID 
      AND T1.[Date] = T2.[Date] 
      AND T1.StartTime <= T2.EndTime 
      AND T1.EndTime >= T2.StartTime 
    ) AS [Count] 
FROM [Table] T1 
GROUP BY 
    T1.DocID 

如果你也想過濾,只顯示記錄與重疊,這可能是最好的子查詢轉換爲連接(沒有任何更有效,但是絕對容易過濾):

SELECT 
    T1.DocID, 
    COUNT(*) AS [Count] 
FROM [Table] T1 
    INNER JOIN [Table] T2 
     ON T1.DocID = T2.DocID 
      AND T1.[Date] = T2.[Date] 
      AND T1.StartTime <= T2.EndTime 
      AND T1.EndTime >= T1.EndTime 
GROUP BY 
    T1.DocID 
HAVING 
    COUNT(*) > 1 
+0

謝謝您寶貴的時間Jason W第二個查詢工作正常...... – rock