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