首页 > 解决方案 > 如何在 SQL 中实现循环?

问题描述

我正在尝试为每位患者计算一个 KPI,该 KPI 称为“初始处方开始日期(IPST)”。

IPST 的定义是,如果患者在开始日期前 60 天内有使用该特定药物的负面历史,则开始日期为 IPST。

例如 - 请参见下面的屏幕截图,对于 ID=101 的患者,我将从 IPST 开始为 4/15/2019 ,2019 年 4 月 15 日和 2019 年 4 月 1 日之间的天数差异为 14 <60,因此我将将我的 IPST 更改为 2019 年 4 月 1 日。

继续这个迭代,101 的 IPST 是 3/17/2019,102 是 3/18/2018,如右侧表格所示。

在此处检查示例计算

我尝试如下构建一个 UDF,其中我传递了患者的 id,而 UDF 正在返回 IPST。

创建函数 [Initial_Prescription_Date] (@id Uniqueidentifier

)返回日期开始{我没有在这里实现这个代码
}


我可以从这样的药物表中获取患者的 Start_dates 列表

从 patient_medication 中选择 id、start_date

我将不得不遍历此列表以获取患者的 IPST。

标签: sqlloops

解决方案


我会回答以便开始我们可以处理的对话。

我遇到的问题是最后一条记录与您选择的 IPST 之间的 ID = 102 的天数差异为 29 天,但您为 102 选择的 IPST 为 393 天,对吗?

你不需要循环来解决这个问题。如果您仅将所有日期与最近的日期进行比较,则可以简单地使用 MAX:

DECLARE @PatientRecords TABLE
(
ID INTEGER,
StartDate DATE,
Medicine VARCHAR(100)
)

INSERT INTO @PatientRecords VALUES
(101,'20181201','XYZ'),
(101,'20190115','XYZ'),
(101,'20190317','XYZ'),
(101,'20190401','XYZ'),
(101,'20190415','XYZ'),
(102,'20190401','XYZ'),
(102,'20190415','XYZ'),
(102,'20190315','XYZ'),
(102,'20180318','XYZ');

With maxCTE AS
(
SELECT *, DATEDIFF(DAY, StartDate, MAX(StartDate) OVER (PARTITION BY ID, MEDICINE ORDER BY StartDate ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)) [IPSTDateDifference]
FROM @PatientRecords
)

SELECT m.ID, m.Medicine, MIN(m.StartDate) [IPST]
FROM maxCTE m
WHERE [IPSTDateDifference] < 60
GROUP BY m.ID, m.Medicine
ORDER BY 1,3;

推荐阅读