Если вы применяете это к достаточно статичной таблице, вы можете применить row_number
, сгруппированный по каждому значению Col4
, упорядоченный по количеству других столбцов, которые не null
:
declare @t table(Col1 int,Col2 int,Col3 int,Col4 nvarchar(6));
insert into @t values
(1,2 ,NULL,'Value1')
,(1,NULL,NULL,'Value1')
,(1,NULL,NULL,'Value2')
,(1,3 ,NULL,'Value2')
;
with d as
(
select Col1
,Col2
,Col3
,Col4
,row_number() over (partition by Col4
order by case when Col1 is null then 1 else 0 end
+case when Col2 is null then 1 else 0 end
+case when Col3 is null then 1 else 0 end
) as rn
from @t
)
select Col1
,Col2
,Col3
,Col4
from d
where rn = 1
;
Выход:
+------+------+------+--------+
| Col1 | Col2 | Col3 | Col4 |
+------+------+------+--------+
| 1 | 2 | NULL | Value1 |
| 1 | 3 | NULL | Value2 |
+------+------+------+--------+