查询具有特定条件的组列表中的项目

时间:2018-05-24 15:03:28

标签: sql sql-server

我正在尝试从列表中选择某些记录。

以下是一些示例数据

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返回行。

2 个答案:

答案 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
             );