我需要一些帮助来解决这个问题。 我有以下表按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行?”** –