我需要一些幫助來解決這個問題。 我有以下表按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
我要檢查,如果前兩行有狀態列不同的值,如果是這樣,我想整個第一行。 我該如何做到這一點?要做到這一點
我需要一些幫助來解決這個問題。 我有以下表按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
我要檢查,如果前兩行有狀態列不同的值,如果是這樣,我想整個第一行。 我該如何做到這一點?要做到這一點
通過「上兩行」假設你的意思是由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
);
第一子查詢獲得最上面一行。第二個子查詢確定狀態是否等於第二行中的狀態。
謝謝!這正是我想要的。如果我想比較Status以外的其他列,遵循相同的邏輯,可以在WHERE語句之後添加AND/OR嗎? – Dias
@Dias。 。 。詢問另一個問題,提供樣本數據和期望的結果。 –
的一種方法是根據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
假設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
,那麼這將是更快相比其他查詢了。
SQL Server 2008 – Dias
嗨。我認爲這個話題還不夠清楚。我可以提出一些不同的建議嗎 - **「如果比較排在最前面的2行,如果有不匹配的話,如何比較排在前面的2行」**或**「如何比較排在前面的2行?」** –