TSQL-从一组行中提取第一个匹配项
我有一个简单的场景,在这个场景中,一个表存储关于用户使用的卡以及这些卡是否在系统中注册(存在)的数据。我也应用了TSQL-从一组行中提取第一个匹配项,sql,tsql,row-number,Sql,Tsql,Row Number,我有一个简单的场景,在这个场景中,一个表存储关于用户使用的卡以及这些卡是否在系统中注册(存在)的数据。我也应用了ROW\u NUMBER对它们进行了分组 从dbo.CardsInfo中选择User、cardd、cardeexists、ROW_NUMBER()作为RowNum(按用户划分) User | CardID | CardExists | RowNum ------------------------------------- A | 1 | 0
ROW\u NUMBER
对它们进行了分组
从dbo.CardsInfo中选择User、cardd、cardeexists、ROW_NUMBER()作为RowNum(按用户划分)
User | CardID | CardExists | RowNum
-------------------------------------
A | 1 | 0 | 1
A | 2 | 1 | 2
A | 3 | 1 | 3
---------------------------------
B | 4 | 0 | 1
B | 5 | 0 | 2
B | 6 | 0 | 3
B | 7 | 0 | 4
---------------------------------
C | 8 | 1 | 1
C | 9 | 0 | 2
C | 10 | 1 | 3
现在在上面,我需要根据下面的两条规则过滤掉用户卡
User | CardID | CardExists | RowNum
-------------------------------------
A | 2 | 1 | 2
---------------------------------
B | 4 | 0 | 1
---------------------------------
C | 8 | 1 | 1
如何在SQL中执行此过滤
谢谢您可以使用:
SELECT ci.*
FROM (SELECT User, CardId, CardExists,
ROW_NUMBER() OVER (PARTITION BY User ORDER BY CardExists DESC, CardId) AS RowNum
FROM dbo.CardsInfo ci
) ci
WHERE seqnum = 1;
您还可以通过聚合执行此操作:
select user,
max(cardexists) as cardexists,
coalesce(min(case when cardexists = 1 then cardid end),
min(card(cardid)
) as cardid
from cardsinfo
group by user;
或者,如果您有单独的用户表:
select ci.*
from users u cross apply
(select top (1) ci.*
from cardinfo ci
where ci.user = u.user
order by ci.cardexists desc, cardid asc
) ci
您的语法不适用于
行编号()
。