2016-10-05 150 views
0

我需要一些幫助來解決這個問題。 我有以下表按ID降序排序方式(dbo.Users):比較同一表中的同一列

ID | UserID | Status | Time | 
3  9200  2  2013-05-03 
2  9200  1  2013-05-02 
1  9200  1  2013-05-01 

我要檢查,如果前兩行有狀態列不同的值,如果是這樣,我想整個第一行。 我該如何做到這一點?要做到這一點

+0

SQL Server 2008 – Dias

+0

嗨。我認爲這個話題還不夠清楚。我可以提出一些不同的建議嗎 - **「如果比較排在最前面的2行,如果有不匹配的話,如何比較排在前面的2行」**或**「如何比較排在前面的2行?」** –

回答

1

通過「上兩行」假設你的意思是由ID降序排序,則:

select u.* 
from (select top 1 u.* 
     from dbo.Users u 
     order by u.id desc 
    ) u 
where u.status <> (select top 1 u2.status 
        from dbo.Users u2 
        where u2.id < u.id 
        order by u2.id desc 
       ); 

第一子查詢獲得最上面一行。第二個子查詢確定狀態是否等於第二行中的狀態。

+0

謝謝!這正是我想要的。如果我想比較Status以外的其他列,遵循相同的邏輯,可以在WHERE語句之後添加AND/OR嗎? – Dias

+0

@Dias。 。 。詢問另一個問題,提供樣本數據和期望的結果。 –

0

的一種方法是根據USERID

SELECT ID 
    ,Userid 
    ,STATUS 
    ,TIME 
    ,ROW_Number() OVER (
     PARTITION BY UserID 
     OVER BY TIME DESC 
     ) AS rn 
FROM TABLE 

行數由用戶ID分區添加計算ROW_NUMBER,因此行號將重新啓動對每個用戶ID。它按照TIME進行排序,但如果你願意,你可以改變它。如果要過濾這些信息,你需要把它包在外層查詢

select * from (SELECT ID 
    ,Userid 
    ,STATUS 
    ,TIME 
    ,ROW_Number() OVER (
     PARTITION BY UserID 
     ,STATUS OVER BY TIME DESC 
     ) AS rn 
FROM TABLE 
)sub 
where sub.rn = 1 
0

假設ID是唯一的,你可以使用下面的代碼:如果你有一個更大的桌子

WITH cte 
AS (SELECT TOP 2 * 
    FROM dbo.users 
    ORDER BY id DESC) 
SELECT cte1.* 
FROM cte cte1 
    INNER JOIN cte AS cte2 
      ON cte1.id > cte2.id 
WHERE cte1.status != cte2.status 

,那麼這將是更快相比其他查詢了。