2016-01-12 35 views
0

一個特定的時間跨度設定後遞歸是我的問題 -如何降低行SQL

的數據包含用戶請求的用戶ID和RequestTime的格式的網站。一個請求包含某個關鍵字是一個指定的搜索。在指定的一天內,在指定搜索後15分鐘內的任何請求被視爲後續搜索,並且將被忽略。所以如果用戶在第一次搜索後的15分鐘內做了3次請求,然後在40分鐘後用相同的關鍵字進行了第四次搜索,則第四次請求被認爲是新的搜索,在第四次搜索後15分鐘內的任何請求被忽略,然後開始計算新的在這15分鐘後要求改變,等等。這裏是源數據集

ClientID RequestTime 
a1 1/10/2016 11:45 
a1 1/10/2016 11:47 
a1 1/10/2016 12:01 
a1 1/10/2016 12:11 
a1 1/10/2016 12:16 
a2 1/10/2016 11:47 
a2 1/10/2016 12:16 
a3 1/10/2016 12:16 

過濾後,結果會是這樣

ClientID RequestTime 
a1 1/10/2016 11:45 
a1 1/10/2016 12:01 
a1 1/10/2016 12:16 
a2 1/10/2016 11:47 
a2 1/10/2016 12:16 
a3 1/10/2016 12:16 

就如何實現這一目標的任何建議嗎?感謝

+1

您正在使用哪一個* RDBMS * –

+0

請看看http://stackoverflow.com/questions/13648693/group-table-into-15-minute-intervals – Hiten004

+0

我正在使用SQL server 2012 – June

回答

0

您應該運行一個查詢了幾次,直到沒有更多的行刪除:

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騰出空間而被刪除。

這很複雜,但我希望我的解釋有幫助。

所以你需要反覆運行這個查詢,直到沒有行被刪除了。 然後您將得到理想的結果。

+0

突出顯示您的代碼並單擊文本窗口上方的大括號按鈕以格式化代碼。或者,縮進一切4個空格。對於內聯代碼,您可以在'代碼'周圍使用重音標記 –

+0

感謝湯姆的幫助 –

+0

非常感謝您的幫助和詳細解釋!就我而言,我希望代碼自動完成這項工作,而不是人爲干擾。 – June