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




