如何统计30天内患者的再入院次数?(多入院/出院日期场景)
统计30天内患者再入院次数的实现方案
核心逻辑说明
要统计30天内再入院,关键是将每位患者的入院记录按时间排序,对比当前入院日期与上一次出院日期的间隔,若间隔≤30天,则计为一次再入院。
示例数据对应预期结果
针对示例中的John Doe(PT Number 55):
- 2023-01-31的入院距上一次出院(2023-01-12)间隔19天,属于30天内再入院
- 2023-06-15的入院距上一次出院(2023-06-01)间隔14天,属于30天内再入院
- 最终该患者的
Readmissions字段值为2
存储过程内的具体实现步骤
假设患者住院记录表名为PatientAdmissions,字段对应:PtName, PTNumber, AdminDate, DischargeDate,提供两种实现方式:
方式1:窗口函数实现(推荐,性能更优)
利用LAG()窗口函数获取同一患者的上一次出院日期,计算间隔天数后统计符合条件的次数:
SELECT PTNumber, PtName, COUNT(CASE WHEN DATEDIFF(day, LAG(DischargeDate) OVER (PARTITION BY PTNumber ORDER BY AdminDate), AdminDate) <= 30 THEN 1 ELSE NULL END) AS Readmissions FROM PatientAdmissions GROUP BY PTNumber, PtName;
PARTITION BY PTNumber:按患者编号分组,确保仅对比同一患者的记录ORDER BY AdminDate:对同一患者的入院记录按时间排序,保证LAG()取到的是上一次出院日期DATEDIFF(day, 上一次出院日期, 当前入院日期):计算日期间隔天数,判断是否≤30
方式2:自连接实现(兼容不支持窗口函数的数据库)
通过自连接关联同一患者的前后入院记录,筛选符合时间间隔条件的记录:
SELECT a.PTNumber, a.PtName, COUNT(b.AdminDate) AS Readmissions FROM PatientAdmissions a LEFT JOIN PatientAdmissions b ON a.PTNumber = b.PTNumber AND b.AdminDate > a.DischargeDate AND DATEDIFF(day, a.DischargeDate, b.AdminDate) <= 30 AND b.AdminDate = ( SELECT MIN(AdminDate) FROM PatientAdmissions WHERE PTNumber = a.PTNumber AND AdminDate > a.DischargeDate ) GROUP BY a.PTNumber, a.PtName;
- 自连接关联同一患者,且下一次入院日期在上次出院日期之后、间隔≤30天
- 子查询确保只取每一次出院后的第一次入院记录,避免重复统计
存储过程整合示例
将上述逻辑整合到存储过程中:
CREATE PROCEDURE Calculate30DayReadmissions AS BEGIN SET NOCOUNT ON; SELECT PTNumber, PtName, COUNT(CASE WHEN DATEDIFF(day, LAG(DischargeDate) OVER (PARTITION BY PTNumber ORDER BY AdminDate), AdminDate) <= 30 THEN 1 ELSE NULL END) AS Readmissions FROM PatientAdmissions GROUP BY PTNumber, PtName; END;
调用存储过程即可获取结果:
EXEC Calculate30DayReadmissions;
注意事项
- 确保日期字段为日期类型,若为字符串需先转换:
CONVERT(date, AdminDate, 101)(101对应MM/DD/YYYY格式) - 若存在同一患者同一天多次入院的情况,需根据业务规则调整排序或去重逻辑
内容的提问来源于stack exchange,提问作者AQuincy
相关产品推荐
相关产品推荐

