1

我有一个 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 的某种组合来完成,但我没有偶然发现正确的组合。

4

2 回答 2

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。如果这不是真的,那么问题是使用哪个日期来确定上一行。

于 2014-07-15T14:47:21.193 回答
0

你可以试试。

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

于 2014-07-15T14:47:00.893 回答