按ID从多行中选择单行

时间:2015-11-05 15:30:07

标签: sql-server

我有一个如下的数据库表。

  id |  value  |flag
   2    null     1
   2     z       2
   3     x       1
   3     y       2
   3     z       3
   4     null    2

我需要结果如下

   id |  value  |flag
   2     z       2
   3     x       1
   4     null     2

如果值为null,则应采用其他匹配id的值(2-z-2)。如果id的所有行都不为null,则应该按优先级取值,此处为1(3-x-1)。如果一个id只有null值,那么带任何一个空值的行和flag就没关系了。

1 个答案:

答案 0 :(得分:5)

此查询将采用第一个非空值(最小标志值)或否则为空行的值。

您的数据:

DECLARE @table TABLE
    ( id INT , val CHAR(1) , flag INT );
INSERT  INTO @table
        ( id, val, flag )
VALUES  ( 2, NULL, 1 )
,       ( 2, 'z', 2 )
,       ( 3, 'x', 1 )
,       ( 3, 'y', 2 )
,       ( 3, 'z', 3 )
,       ( 4, NULL, 2 ); -- NULL only value

<强>查询:

SELECT  id ,
        val ,
        flag
FROM    ( SELECT    * ,
            n = ROW_NUMBER() OVER ( PARTITION BY id ORDER BY CASE
                                                    WHEN val IS NULL
                                                    THEN 0
                                                    ELSE 1
                                                    END DESC, flag )
          FROM      @table AS t
        ) AS o
WHERE   n = 1;
ROW_NUMBER()分区的{p> id分区和id分区,按0或1(空/非空)和flag排序。 case用于按not null值排序(= 1),然后按null值排序(= 0)。

<强>输出:

id  val     flag
2   z       2
3   x       1
4   NULL    1