【问题标题】:Select each record with first NULL Value after non-NULL value in record set选择记录集中非 NULL 值后第一个 NULL 值的每条记录
【发布时间】:2014-09-05 19:42:00
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我想你只是想要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 时,维修数据等于检查日期。如果这不是真的,那么问题是使用哪个日期来确定上一行。

    【讨论】:

    • 天哪,这是一个有用的命令。期待我们现在离开 2008 年:D
    • 这太完美了!我以前从未见过延迟功能。正如@franglais 所说,神圣的魔力是一种强大的工具!
    【解决方案2】:

    你可以试试。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多