2016-10-17 52 views
1
IP    QID ScanDate    Rank 
101.110.32.80 6 2016-09-28 18:33:21.000 3 
101.110.32.80 6 2016-08-28 18:33:21.000 2 
101.110.32.80 6 2016-05-30 00:30:33.000 1 

我有一定的記錄,通過Ipaddress:顯示和QID分組表格。我的要求是找出哪些記錄錯過了日期列或換句話說日期差異的序列超過30天。在上面的表格中,日期差異在1級和2級之間超過30天。所以,我應該標記2級記錄。查找記錄的DATEDIFF在同一表

+0

請出示預期的結果,也標記SQL – TheGameiswar

回答

0

我會用窗口函數來避免自加入這在很多情況下會表現得更好。

WITH cte 
      AS (
       SELECT 
       t.IP 
       , t.QID 
       , LAG(t.ScanDate) OVER (PARTITION BY t.IP ORDER BY T.ScanDate) AS beginScanDate 
       , t.ScanDate AS endScanDate 
       , DATEDIFF(DAY, 
         LAG(t.ScanDate) OVER (PARTITION BY t.IP ORDER BY t.ScanDate), 
         t.ScanDate) AS Diff 
       FROM 
       MyTable AS t 
      ) 
    SELECT 
     * 
    FROM 
     cte c 
    WHERE 
     Diff > 30; 
1

雖然Window Functions可以在這裏使用,我覺得自連接可能會更直接,更容易理解:

SELECT 
t1.IP, 
    t1.QID, 
    t1.Rank, 
    t1.ScanDate as endScanDate, 
    t2.ScanDate as beginScanDate, 
    datediff(day, t2.scandate, t1.scandate) as scanDateDays  
FROM 
    table as t1 
    INNER JOIN table as t2 ON 
     t1.ip = t2.ip 
     t1.rank - 1 = t2.rank --get the record from t2 and is one less in rank 
WHERE datediff(day, t2.scandate, t1.scandate) > 30 --only records greater than 30 days 

這是不言自明。我們一起加入到自己的隊伍中,等級2加入隊列1,隊列3加入隊列2,等等。然後我們只需使用datediff函數測試大於30天的記錄。

+0

的版本,我不知道爲什麼「秩」是與此有關 – Kilren

+1

的一種方法,不考慮等級會顯示這兩個等級的元組(1, 2)和(1,3)被標記。由於op沒有提出等級元組(1,3),我假定OP只關心連續等級之間的日期範圍。由於這些連接是明確定義的,並且考慮到OP沒有發現任何解決方案,即使有多個解決方案,我也決定使用連續的等級建立自我連接以建立關係將是一個不錯的選擇。 – JNevill

1

您可以在SQL 2012+

declare @Tbl Table (Ip VARCHAR(50), QID INT, ScanDate DATETIME,[Rank] INT) 

INSERT INTO @Tbl   
VALUES 
('101.110.32.80', 6, '2016-09-28 18:33:21.000', 3), 
('101.110.32.80', 6, '2016-08-28 18:33:21.000', 2), 
('101.110.32.80', 6, '2016-05-30 00:30:33.000', 1) 

;WITH Result 
AS 
(
    SELECT 
     T.Ip , 
     T.QID , 
     T.ScanDate , 
     T.[Rank], 
     LAG(T.[Rank]) OVER (ORDER BY T.[Rank]) PrivSRank, 
     LAG(T.ScanDate) OVER (ORDER BY T.[Rank]) PrivScanDate 
    FROM 
     @Tbl T 
) 

SELECT 
    R.Ip , 
    R.QID , 
    R.ScanDate , 
    R.Rank , 
    R.PrivScanDate, 
    IIF(DATEDIFF(DAY, R.PrivScanDate, R.ScanDate) > 30, 'This is greater than 30 day. Rank ' + CAST(R.PrivSRank AS VARCHAR(10)), '') CFlag 
FROM 
    Result R 

結果使用LAG

Ip      QID   ScanDate    Rank  CFlag 
------------------------ ----------- ----------------------- ----------- -------------------------------------------- 
101.110.32.80   6   2016-05-30 00:30:33.000 1   
101.110.32.80   6   2016-08-28 18:33:21.000 2   This is greater than 30 day. Rank 1 
101.110.32.80   6   2016-09-28 18:33:21.000 3   This is greater than 30 day. Rank 2 
相關問題