2016-10-05 95 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 

,那么这将是更快相比其他查询了。