2016-08-18 53 views
2

實施例的查詢當ID相同檢查序號大於先前提交

USE HES 
SELECT T1.ID, T2.DATE, T1.ORDINAL 
FROM TABLE1 AS T1 
LEFT JOIN TABLE2 AS T2 
    ON T1.ID = T2.ID AND T1.PARTYEAR = T2.PARTYEAR 
WHERE 
    T1.MONTHYEAR = '201501'    

從示例查詢

ID Date Ordinal 

1 01/01/2016 1 
1 02/01/2016 2 
1 03/01/2016 3 
2 04/01/2016 1 
2 05/01/2016 2 
3 06/01/2016 1 
3 07/01/2016 2 
3 08/01/2016 3  
4 09/01/2016 1 
4 10/01/2016 1 

問題

每個用戶結果有一個獨特的ID,每個ID我怎麼會檢查每個數據提交包含的序數大於先前提交的數據。

因此,在上面的示例查詢結果中,ID 4包含一個問題。

我對SQL相當陌生,我一直在尋找類似的例子,但沒有成功。

任何幫助將不勝感激。

+0

您正在使用什麼版本的SQL Server?你到目前爲止所嘗試的任何東西都不起作用? – NickyvV

+0

所以輸出將是4 – Mani

+2

希望你在2012+,使用超前/滯後 – Serg

回答

0

使用LAG與OVER子句:

WITH cte AS 
(
    SELECT T1.ID, T2.DATE, T1.ORDINAL, LAG(T1.ORDINAL) OVER(PARTITION BY T1.ID ORDER BY T1.ORDINAL) AS LagOrdinal 
    FROM TABLE1 AS T1 
    LEFT JOIN TABLE2 AS T2 
     ON T1.ID = T2.ID AND T1.PARTYEAR = T2.PARTYEAR 
    WHERE 
     T1.MONTHYEAR = '201501' 
) 
SELECT ID, DATE, ORDINAL, CASE WHEN ORDINAL > LagOrdinal THEN 1 ELSE 0 END AS OrdinalIsGreater 
    FROM cte; 
+0

我能夠很容易地更新它,它似乎是完美的工作。非常感謝你的幫助! –

+0

@菲奧娜貝克,不客氣 –

0

像@Serg說,你可以使用lag

select * 
    from (
    SELECT T1.ID, T2.DATE, T1.ORDINAL, 
      lag(t1.ordinal) over (partition by t1.id order by t2.date) as prevOrdinal 
    FROM TABLE1 AS T1 
    LEFT JOIN TABLE2 AS T2 
     ON T1.ID = T2.ID AND T1.PARTYEAR = T2.PARTYEAR 
    WHERE 
     T1.MONTHYEAR = '201501') as t 
    where t.prevOrdinal >= t.ordinal; 

輸出

ID DATE  ORDINAL prevOrdinal 
4 2016-10-01 1  1 
0

試試這個實現這一目標:

SELECT * INTO #tmp 
FROM (VALUES  
(1, CONVERT(date, '01/01/2016'), 1), 
(1, '02/01/2016', 2), 
(1, '03/01/2016', 3), 
(2, '04/01/2016', 1), 
(2, '05/01/2016', 2), 
(3, '06/01/2016', 1), 
(3, '07/01/2016', 2), 
(3, '08/01/2016', 3), 
(4, '09/01/2016', 1), 
(4, '10/01/2016', 1) 
)T(ID, Date, Ordinal) 

WITH Numbered AS 
(
    SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date) R, * 
    FROM #tmp 
) 
SELECT N2.ID, N2.Date, N1.Ordinal Prev, N2.Ordinal Curr 
FROM Numbered N1 
JOIN Numbered N2 ON N1.R+1=N2.R AND N1.ID=N2.ID 
WHERE N1.Ordinal >= N2.Ordinal 

它可以簡化SQL Server時版本> = 2012,#tmp是你當前的結果。