簡體   English   中英

如何在SQL中遞歸特定時間段后減少行集

[英]How to reduce row set after a specific timespan recursively in SQL

這是我的問題-

數據包含用戶對網站的請求,格式為userID和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

關於如何實現這一目標的任何建議? 謝謝

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

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不在T2之后的15分鍾之內出現在T2之后,因此“ AND T3.time <T2.time + 15 minutes”子句為假,因此不會按預期刪除任何行

在組合B(和D)中,T3確實在距T2 15分鍾之內到達,但是不確定T2是否會保留。

在組合B中,很明顯“ T1.time> T2.time-15分鍾”子句是假的,但是由於我們要求大多數內部查詢不存在,這意味着NOT EXISTS子句本身給出了一個真,而T3是已刪除。

在組合D中,最內部的子句“ T1.time> T2.time-15分鍾”為true,因此NOT EXISTS子句本身給出了false,並且不刪除T3(或者在這種情況下,不是YET)。

可能是這樣,如果將在第一輪中刪除T2,則將在第二輪中將T3與新的T2(之前是T1或比T1甚至更早的事件)進行比較,無論如何,T3都可以保留。 T1(不認為它是絕對的第一個)將在第1輪中刪除,而不是T2可能永遠存在,而T3在第2輪中將被刪除,因為它接近於T2,而現在T2距離未刪除的前任足夠遠。

在您的示例中-從T3的角度僅考慮行,因為我們只刪除了T3的行:

在第一輪中,作為T3的11:45沒有前任,因此T2不存在,因此中間查詢返回false。 在第一輪中,作為T3的11:47擁有一個太接近的T2(T3.time <T2.time + 15分鍾),並且由於不存在T1,所以最內部的查詢也是正確的(從NOT EXISTS點出發)看法)。 因此11:47將被刪除。 在第一輪中,所有其他時間都將保留(暫時)。

在第二輪中,T3的12:01與T2具有11:45,但距離足夠遠(T3.time <T2.time + 15分鍾為假),因此它將保留。 在第二輪中,作為T3的12:11現在與T2具有12.10的距離,該距離太近,並且由於T2與T1的距離足夠遠,因此內部查詢也可以,並且必須刪除12:11。

在第三輪中12:16不會被刪除,因為12:11為它騰出了空間。

這很復雜,但我希望我的解釋會有所幫助。

因此,您需要一遍又一遍地運行此查詢,直到不再刪除任何行為止。 然后,您將獲得所需的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM