如何用SQL统计上月患者住院天数?无日历表/递归查询失效求助
解决方案
要统计患者在上月的住院天数,核心是计算患者住院周期与上月时间范围的重叠天数,无需创建日历表或递归查询。以下是调整后的SQL:
-- 定义上月的起始和本月起始(上月结束为本月起始前一天) DECLARE @last_month_start DATETIME = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()) - 1, 1); DECLARE @current_month_start DATETIME = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1); SELECT OrgKey , visID , visPatID , visInternal , visName , visAssignedNS , visAssignedRoom , visAssignedBed , visAdmitDT , ISNULL(visDischargeDT, GETDATE()) AS disDT -- 计算上月内的住院天数:取住院周期与上月的重叠区间天数 , CASE WHEN MAX(visAdmitDT, @last_month_start) >= MIN(ISNULL(visDischargeDT, GETDATE()), @current_month_start) THEN 0 ELSE DATEDIFF(DAY, MAX(visAdmitDT, @last_month_start), MIN(ISNULL(visDischargeDT, GETDATE()), @current_month_start)) END AS Last_Month_PT_Days FROM MH_Pharmacy_Hub.MC.dbo_Visits -- 过滤出与上月有住院交集的患者 WHERE visAdmitDT < @current_month_start AND (visDischargeDT IS NULL OR visDischargeDT > @last_month_start) GROUP BY OrgKey, visID, visPatID, visInternal, visName, visAssignedNS, visAssignedRoom, visAssignedBed, visAdmitDT, visDischargeDT;
关键逻辑说明
- 上月时间范围:用
DATEFROMPARTS精准获取上月第一天和本月第一天,确保跨年度(如1月的上月是去年12月)也能正确计算。 - 重叠天数计算:
- 重叠起始:取患者入院日期和上月第一天的较大值
- 重叠结束:取患者出院日期(未出院则用当前日期)和本月第一天的较小值
- 若重叠起始 >= 重叠结束,说明该患者上月无住院天数,返回0;否则计算区间天数
- 过滤条件:仅保留住院周期与上月有交集的记录,避免无效计算
内容的提问来源于stack exchange,提问作者Clay
相关产品推荐
相关产品推荐

