编写SQL查询获取近3年无'K'状态预约的患者列表
获取近3年无'K'状态预约的患者列表解决方案
方法1:左连接+分组统计
适合大多数类MySQL的受限数据库,可包含近3年无任何预约的患者:
SELECT p.PATUNIQUE, p.患者姓名 -- 替换为你需要的患者字段 FROM PATIENT p LEFT JOIN APPT a ON p.PATUNIQUE = a.PATUNIQUE AND a.APPT_DATE >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR) -- 替换为实际预约日期字段 GROUP BY p.PATUNIQUE, p.患者姓名 HAVING SUM(CASE WHEN a.STATUS = 'K' THEN 1 ELSE 0 END) = 0;
逻辑说明
- 左连接保留所有患者,仅关联近3年的预约记录
- 分组后统计该患者近3年'K'状态预约的次数,次数为0则符合要求(包括无近3年预约的患者)
方法2:NOT EXISTS子查询
更直观的写法,避免分组,注意子查询仅返回单列:
SELECT p.PATUNIQUE, p.患者姓名 FROM PATIENT p WHERE NOT EXISTS ( SELECT 1 -- 用SELECT 1避免返回多列报错 FROM APPT a WHERE a.PATUNIQUE = p.PATUNIQUE AND a.STATUS = 'K' AND a.APPT_DATE >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR) );
逻辑说明
- 检查当前患者是否存在近3年的'K'状态预约,不存在则返回该患者
注意事项
- 务必将
APPT_DATE替换为APPT表中实际存储预约日期的字段名 - 如果数据库不支持
DATE_SUB,可手动指定3年前的日期(如a.APPT_DATE >= '2021-09-25'),或尝试a.APPT_DATE >= CURDATE() - INTERVAL 3 YEAR - 若需仅保留近3年有预约但无'K'状态的患者,可在WHERE后追加:
AND EXISTS ( SELECT 1 FROM APPT a WHERE a.PATUNIQUE = p.PATUNIQUE AND a.APPT_DATE >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR) )
内容的提问来源于stack exchange,提问作者Nick Lopez
相关产品推荐
相关产品推荐

