You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:27:37