如何在一定条件下获取每条记录

时间:2019-04-16 01:57:30

标签: sql sql-server sql-server-2012

我有以下数据:

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吗?

1 个答案:

答案 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 <>小提琴。