sql - 根据前一列序列更新列
问题描述
我有这个基于上一列检查运行的连续列。当检查不符合条件时,它返回空值。现在我想返回 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
解决方案
您要确保在窗口函数中向后看以检查其他空值。如果没有您的所有数据,我们将无法明确解决您的问题,但这是您正在寻找的示例:
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
推荐阅读
- google-app-engine - Google App Engine 标准环境中的 Gunicorn 命令行错误
- java - 如何将 java.lang.String 转换为 kotlin.String?单击“将 java 文件转换为 kotlin 文件”时
- android - 改造,无法从我的 api 在 recyclerview 上显示我的数据
- python-3.x - 在 pytorch 中学习之前对图像进行归一化
- python - Python - 登录后 Django 站点管理页面为空
- github - 如何在 Spinnaker 管道中使用 github 文件
- java - 通过我的命令行运行 Java 代码时出现路径错误
- istio - Istio,使用 mTLS 和现有证书的自定义出口
- tomcat - Tomcat访问日志中奇怪的服务器主机名
- azure - 防止盗版我的 Azure VMI 解决方案软件的程序检查