您應該運行一個查詢了幾次,直到沒有更多的行刪除:
DELETE FROM T3
WHERE EXISTS
(SELECT 1 FROM T2
WHERE T3.time > T2.time
AND T3.time < T2.time + 15 minutes
AND NOT EXISTS
(SELECT 1 FROM T1
WHERE T1.time < T2.time
AND T1.time > T2.time - 15 minutes))
說明
T1,T2和T3行時間T1.time < T2.time < T3.time
您可以在任何T1,T2,T3的4種組合,其中T1 < T2 < T3:
All more than 15 minutes apart (combi A):
T1
T2 - 15 minutes
T2
T2 + 15 minutes
T3
or T3 < T2 + 15 (combi B):
T1
T2 - 15 minutes
T2
T3
T2 + 15 minutes
or T1 > T2 - 15 minutes (combi C):
T2 - 15 minutes
T1
T2
T2 + 15 minutes
T3
or both T3 < T2 + 15 and T1 > T2 - 15 minutes (combi D)
T2 - 15 minutes
T1
T2
T3
T2 + 15 minutes
在組合A(和C)T3不15分鐘T2 該條「AND T3.time < T2.time + 15分」的內T2之後而來的是假的,所以沒有行也會被預期
刪除
組合B(和D)T3在T2以後15分鐘內到達,但不確定T2是否自己保留。
在組合B中,顯而易見,「T1.time> T2.time - 15分鐘」這個子句是錯誤的,但是因爲我們要求大多數內部查詢不應該存在,這意味着NOT EXISTS子句本身給出了真,T3被刪除。
在組合D中,最內部的子句「T1.time> T2.time - 15分鐘」是真實的,所以NOT EXISTS子句本身給出了錯誤,並且T3不是(或者在這種情況下更好,不是YET)被刪除。
可能是這樣的,如果T2將在第一輪中被刪除,那麼在第二輪T3中將與新的T2進行比較(之前是T1或者甚至比T1更早的事件,T3可以停留無論如何,如果T1(不認爲它是絕對的第一個)在第一輪中被刪除,那麼T2可能會永遠保留下來,第二輪中的T3將被刪除,以接近現在距離第二輪足夠遠的T2未缺失的前身
在您的例子 - 從一個T3點只考慮行,因爲我們只刪除T3的:
在第一輪被11:45 T3沒有一個前任,所以T2不存在它d中間查詢返回false。 在第一輪中,11:47是T3有一個T2太接近(T3.time < T2.time + 15分鐘),並且由於T1不存在,所以最內部的查詢也是真實的(從NOT EXISTS-觀點看法)。所以11:47將被刪除。 在第一輪中,所有其他時間都會停留(現在)。
第二輪12:01是T3有11:45作爲T2,但距離足夠遠(T3.time < T2.time + 15分鐘爲假),所以它會停留。 在第二輪中,12:11是T3,現在有12.10,因爲T2太靠近了,而T2距離T1足夠遠,內部查詢也沒問題,12:11必須刪除。
在第三輪中12:16不會因爲12:11騰出空間而被刪除。
這很複雜,但我希望我的解釋有幫助。
所以你需要反覆運行這個查詢,直到沒有行被刪除了。 然後您將得到理想的結果。
您正在使用哪一個* RDBMS * –
請看看http://stackoverflow.com/questions/13648693/group-table-into-15-minute-intervals – Hiten004
我正在使用SQL server 2012 – June