You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

SQL Server使用LAG函数计算日期差异常及患者随访查询求助

解决患者呼叫后7天内无随访预约的查询问题

看起来你在处理患者随访数据时遇到了两个关键问题,咱们一步步拆解解决:

先修正你当前查询的两个错误

1. DIFFERENCE字段格式异常的原因

你的日期差计算逻辑完全走偏了:(APPOINTMENT_DATE - LAG(APPOINTMENT_DATE)...) 在SQL Server里会返回一个datetime类型(比如两个日期差5天,结果是1900-01-05 00:00:00),之后你又用DATEDIFF去计算这个值和当前APPOINTMENT_DATE的天数差,这根本不是你想要的“两次预约间隔天数”,自然会出现格式/逻辑异常。

2. 未按患者分组计算日期差

你的LAG函数没有加PARTITION BY PATIENT_ID,导致会跨患者取上一条预约记录,这就会出现A患者的预约和B患者的预约算日期差的错误情况。


修正后的基础查询(计算患者连续预约间隔)

先把基础的日期差查询改对,这能帮你理清患者的预约时序:

SELECT 
    PATIENT_ID,
    APPOINTMENT_DATE,
    -- 取同一患者的上一次预约日期
    LAG(APPOINTMENT_DATE) OVER (PARTITION BY PATIENT_ID ORDER BY APPOINTMENT_DATE) AS PREVIOUS_APPOINTMENT_DATE,
    -- 正确计算两次预约的间隔天数
    DATEDIFF(DAY, 
             LAG(APPOINTMENT_DATE) OVER (PARTITION BY PATIENT_ID ORDER BY APPOINTMENT_DATE), 
             APPOINTMENT_DATE) AS DAYS_SINCE_LAST_APPOINTMENT
FROM [dbo].[Appointment Data]

针对核心需求:找出呼叫后7天内无随访预约的患者

假设你的表中有APPOINTMENT_TYPE字段(比如标记为'呼叫''随访'),用NOT EXISTS子查询就能精准筛选出目标患者:

SELECT 
    c.PATIENT_ID,
    c.APPOINTMENT_DATE AS CALL_DATE
FROM [dbo].[Appointment Data] c
WHERE 
    -- 筛选出所有呼叫记录
    c.APPOINTMENT_TYPE = '呼叫' 
    -- 检查该呼叫后7天内,该患者没有任何随访预约
    AND NOT EXISTS (
        SELECT 1
        FROM [dbo].[Appointment Data] f
        WHERE 
            f.PATIENT_ID = c.PATIENT_ID
            AND f.APPOINTMENT_TYPE = '随访'
            AND f.APPOINTMENT_DATE BETWEEN c.APPOINTMENT_DATE AND DATEADD(DAY, 7, c.APPOINTMENT_DATE)
    )

如果你的表没有区分呼叫/随访的字段,而是把“首次预约”当作呼叫,要找首次预约后7天内无后续预约的患者,可以用这个版本:

WITH PatientFirstAppointment AS (
    SELECT 
        PATIENT_ID,
        MIN(APPOINTMENT_DATE) AS FIRST_APPOINTMENT_DATE
    FROM [dbo].[Appointment Data]
    GROUP BY PATIENT_ID
)
SELECT 
    p.PATIENT_ID,
    p.FIRST_APPOINTMENT_DATE AS CALL_DATE
FROM PatientFirstAppointment p
WHERE NOT EXISTS (
    SELECT 1
    FROM [dbo].[Appointment Data] f
    WHERE 
        f.PATIENT_ID = p.PATIENT_ID
        AND f.APPOINTMENT_DATE > p.FIRST_APPOINTMENT_DATE
        AND f.APPOINTMENT_DATE <= DATEADD(DAY, 7, p.FIRST_APPOINTMENT_DATE)
)

内容的提问来源于stack exchange,提问作者Swapnil Shankar

火山引擎 最新活动