sql - 如何在 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。
解决方案
我会回答以便开始我们可以处理的对话。
我遇到的问题是最后一条记录与您选择的 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;
推荐阅读
- c - Postgres 中是否有使用 palloc() 分配内存的 sizeof() 方法?
- oracle - 无法从 cmd PL/SQL 中的简单查询中获得正确的结果
- bootstrap-4 - 将引导程序 4 替换为 5 时无法关闭模式
- django-forms - Django 表单。如何添加包含引号的 Widget 属性?
- r - 使用 dplyr 在每个因子中的比例
- powerbi - Power BI-Group By(电源查询)与措施!哪个更厉害
- python - 无法打开 [imagetitle].png
- mathematical-optimization - 生成初始解决方案的更好方法是什么?
- javascript - Papaparse 本地文件未显示任何数据
- c++ - 与 PreMake 的静态链接