[英]Compare the same column in same table
我需要一些幫助來解決這個問題。 我有下表(dbo.Users)按ID降序排列:
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
);
第一個子查詢獲得第一行。 第二個子查詢確定狀態是否等於第二行中的狀態。
一種方法是根據USERID添加計算的row_number
SELECT ID
,Userid
,STATUS
,TIME
,ROW_Number() OVER (
PARTITION BY UserID
OVER BY TIME DESC
) AS rn
FROM TABLE
行號按用戶ID划分,因此將為每個用戶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
如果您有更大的表,那么與其他查詢相比,這將更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.