我有以下数据:
DECLARE @temp TABLE (
ID int
,sn varchar(200)
,comment varchar(2000)
,rownumber int
)
insert into @temp values(1,'sn1',NULL,1)
insert into @temp values(2,'sn1','aaa',2)
insert into @temp values(3,'sn1','bbb',3)
insert into @temp values(4,'sn1',NULL,4)
insert into @temp values(5,'sn2',NULL,1)
insert into @temp values(6,'sn2',NULL,2)
insert into @temp values(7,'sn2',NULL,3)
select * from @temp
我想这样输出:
2 sn1 aaa 2
5 sn2 NULL 1
相同的sn,如果注释具有值,则获取此较低的行号的记录。对于sn1,有两个带有注释值的记录,因此在这里,获取具有rownumber = 2的记录
如果注释没有价值,请获取较低的行号记录。对于sn2,获取具有rownumber = 1的记录
我可以知道如何编写此SQL吗?
答案 0 :(得分:0)
这是一个优先级查询。我认为row_number()
是最简单的方法:
select t.*
from (select t.*,
row_number() over (partition by sn
order by (case when comment is not null then 1 else 2 end),
rownumber
) as seqnum
from @temp t
) t
where seqnum = 1;
Here是db <>小提琴。