我正在尝试从列表中选择某些记录。
以下是一些示例数据
declare @datas table(BodyNumber int, Id int, RegNumber bigint, DeletedRegNumber bigint null)
insert into @datas values(70, 355, 559, 559)
insert into @datas values(70, 581, 660, NULL)
insert into @datas values(53, 424, 354, 354)
insert into @datas values(53, 429, 364, 364)
insert into @datas values(60, 395, 519, NULL)
insert into @datas values(60, 428, 296, 296)
insert into @datas values(65, 398, 518, NULL)
insert into @datas values(65, 430, 256, 256)
BodyNumber
可以有多个RegNumber
。我正在寻找Id
,它不是组中最高的Id
,并且该组在DeletedRegNumber
列中有一个NULL值。
例如,排除第一对(70),因为NULL位于“顶部”。第二组(53)也被排除,因为组中没有NULL。第3组和第4组很重要,因为NULL值后跟非NULL。
因此查询需要使用Id
395和398返回行。
答案 0 :(得分:0)
您可以使用ROW_NUMBER()
来确定哪个行的ID最低。使用IN
仅查找具有空值的正文编号。
;WITH cte AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY BodyNumber ORDER BY ID ASC) AS rn
FROM @datas)
SELECT *
FROM cte WHERE rn = 1 AND DeletedRegNumber IS NULL
AND bodynumber IN (SELECT bodynumber FROM @datas WHERE DeletedRegNumber IS NULL)
答案 1 :(得分:0)
嗯。
select d.*
from @datas d
where d.DeletedRegNumber is null and
exists (select 1
from @datas d2
where d2.BodyNumber = d.BodyNumber and d2.id > d.id
);