簡體   English   中英

比較同一表中的同一列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM