在记录集中的非NULL值之后,选择具有第一个NULL值的每个记录

时间:2014-07-15 14:40:33

标签: sql sql-server group-by sql-server-2012 partition

我有一个SQL查询,它在一台设备上返回一组检查,其中一列指示对记录集所代表的设备进行维修的日期。如果在检查时没有进行修复,则该字段为NULL。有问题的设备将在其使用寿命期间多次修复。

我想在查询中找到记录的子集,每个记录后面的最小InspectionDate具有非NULL修复日期,在RepairDate字段中具有NULL值。

例如:

InspectionDate            ReprairDate              OtherData
1/1/2010                  NULL                     ...
2/1/2010                  NULL                     ...
2/15/2010                 2/15/2010                ...
3/1/2010                  NULL                     ...
4/1/2010                  NULL                     ...
5/1/2010                  5/1/2010                 ...
6/1/2010                  6/1/2010                 ...
7/1/2010                  NULL                     ...

应该配对:

InspectionDate            ReprairDate              OtherData
1/1/2010                  NULL                     ...
3/1/2010                  NULL                     ...
7/1/2010                  NULL                     ...

我知道使用光标这将是一个相当微不足道的事情,但我试图摆脱一般使用它们并觉得这可以通过PARTION,OVER和GROUP BY的某种组合来完成,但我还没有偶然发现了正确的组合。

2 个答案:

答案 0 :(得分:5)

我认为你只想要lag()

select t.*
from (select t.*, lag(RepairDate) over (order by InspectionDate) as prevRepairDate
      from table t
     ) t
where prevRepairDate is not null and RepairDate is NULL;

在您的数据中,当RepairDate不是NULL时,修复数据等于检查日期。如果不是这样,那么问题是用于确定前一行的日期。

答案 1 :(得分:0)

你可以尝试一下。

UPDATE a
SET a.ReprairDate = NULL
FROM TABLE a
WHERE a.InspectionDate < '8/1/2010' 

UPDATE a SET a.ReprairDate = NULL FROM TABLE a WHERE a.InspectionDate < '8/1/2010'