如何在SQL中实现循环?

时间:2019-05-04 01:18:09

标签: sql loops

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

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

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

如右表所示,此迭代的IPST继续为2019年3月17日,而IPST为2018年3月18日。

Check example calculation here

我试图按如下所示构建UDF,我在这里传递患者的ID,而UDF返回IPST。

创建功能[Initial_Prescription_Date] ( @id Uniqueidentifier

) 退货日期 如 开始      {          我无法在此处实现此代码
     }


我可以从这样的药物表中获取患者的开始日期列表

选择ID,从Patient_Medication开始日期

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

1 个答案:

答案 0 :(得分:0)

我将回答以启动一个我们可以处理的对话框。

我遇到的问题是,上一条记录与您为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;