比较同一个表中的同一列

时间:2016-10-05 20:28:34

标签: sql sql-server sql-server-2008 join

我需要一些帮助来解决这个问题。 我有以下表格(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

我想检查前两行是否具有Status列的不同值,如果是,我想获取整个第一行。 我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

假设“前两行”是指按降序排序,那么:

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
                  );

第一个子查询获得第一行。第二个子查询确定状态是否等于第二行中的状态。

答案 1 :(得分:0)

执行此操作的一种方法是根据USERID

添加计算的row_number
SELECT ID
    ,Userid
    ,STATUS
    ,TIME
    ,ROW_Number() OVER (
        PARTITION BY UserID
        OVER BY TIME DESC
        ) AS rn
FROM TABLE

行号由userid分区,因此将为每个userID重新启动行号。它根据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

答案 2 :(得分: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 

如果你有一个更大的表,那么与其他查询相比,这也会更快。