首页 > 解决方案 > 根据前一列序列更新列

问题描述

我有这个基于上一列检查运行的连续列。当检查不符合条件时,它返回空值。现在我想返回 null 之后的每个值,作为 null,因为我不需要它们。我怎么做?

我有这些客户进入药房并服用 30 天的药物。在完成 30 剂药物后,为客户提供 7 天的 lee way。如果他在 7 天之后来,他会重新开始服药,例如,如果客户在 2019 年 8 月 14 日进入药房并服用药物,他应该在 2019 年 9 月 14 日或 7 日内的任何一天回来补充药物该日期后的几天。

SELECT Id,ClientID,VisitDate,PreviousVisitDate, rn, 
DATEDIFF(dd,PreviousVisitDate,VisitDate) As DaysBetweenVisit, 
CASE WHEN DATEDIFF(dd,PreviousVisitDate,VisitDate) <=37 THEN rn
     WHEN rn =1 THEN rn
END  rn_new
    FROM (
            SELECT Id,A.ClientId as ClientId, VisitDate, rn,
            CASE WHEN rn= 1 THEN NULL
            WHEN rn > 1 THEN LAG(VisitDate) OVER (ORDER BY ClientId)
            END as PreviousVisitDate

    FROM  [dbo].[SomeTable] A ) B; 

Id      ClientID        VisitDate   PreviousVisitDate   rn  DaysBetweenVisit    rn_new                              
25208   10269-07-2/18   2018-05-14  2018-04-11          2   33                  2 
44538   10269-07-2/18   2018-06-12  2018-05-14          3   29                  3 
44539   10269-07-2/18   2018-08-04  2018-06-12          4   53                  NULL 
44543   10269-07-2/18   2018-09-04  2018-08-04          5   31                  5 
44544   10269-07-2/18   2018-10-03  2018-09-04          6   29                  6

在此处输入图像描述

我希望最后一列中的 5 和 6 为 NULL,因为它们已经在第 4 个序列中遇到了 null

标签: sqlsql-serversql-server-2016

解决方案


您要确保在窗口函数中向后看以检查其他空值。如果没有您的所有数据,我们将无法明确解决您的问题,但这是您正在寻找的示例:

DECLARE @t TABLE
(
ID INTEGER,
Seq INTEGER,
Val INTEGER,
RequiredValue INTEGER
);

INSERT INTO @t VALUES (1,1,NULL,1),(1,2,33,2),(1,3,29,3),(1,4,53,NULL),(1,5,31,5),(1,6,29,6);

SELECT *, IIF(NewRequiredValue = -1, NULL, RequiredValue) NewRequiredValue
FROM
(
SELECT *, MIN(ISNULL(RequiredValue, -1)) OVER (PARTITION BY ID ORDER BY Seq ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) [NewRequiredValue]
FROM @t
) a;

结果如下:

ID          Seq         Val         RequiredValue NewRequiredValue NewRequiredValue
----------- ----------- ----------- ------------- ---------------- ----------------
1           1           NULL        1             1                1
1           2           33          2             1                2
1           3           29          3             1                3
1           4           53          NULL          -1               NULL
1           5           31          5             -1               NULL
1           6           29          6             -1               NULL

推荐阅读