我需要一些帮助来解决这个问题。 我有以下表格(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列的不同值,如果是,我想获取整个第一行。 我怎样才能做到这一点?
答案 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_numberSELECT 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
如果你有一个更大的表,那么与其他查询相比,这也会更快。