我有一个如下的数据库表。
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就没关系了。
答案 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