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
现在在上面,我需要根据下面的两条规则过滤掉用户卡

  • 如果在向用户注册的卡中,系统中存在多张卡,则使用第一张卡。因此,对于用户A,将返回CardID 2,对于用户C,将返回CardID=8
  • 另外,如果系统中没有该用户的卡(已注册),则只需使用第一张卡。因此,对于用户B,它应该返回CardID=4
  • 因此,最终返回集应该是-

    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
    

    您的语法不适用于
    行编号()