基于前3行条件的MySQL DATEDIFF再入院判定问题排查
解决MySQL精神科就诊30天内再入院标记错误问题
问题根源分析
你当前的错误核心在于:仅通过JSON_ARRAYAGG()判断前3行存在精神科就诊就标记为'Y',但未精准提取最近一次精神科就诊的出院日期并验证日期差是否小于30天;或者日期差计算逻辑颠倒(比如用出院日期减入院日期,导致负数被误判为小于30)。
修正后的查询方案
以下是重构后的SQL逻辑,直接针对你的需求实现精准判断:
WITH patient_visits AS ( SELECT mr_no, admit_date, dischg_date, pat_status, -- 标记当前就诊是否为精神科 CASE WHEN pat_status LIKE '%IC%' OR pat_status LIKE '%IY%' THEN 1 ELSE 0 END AS is_psych, -- 按患者分组、入院日期排序生成就诊序号 ROW_NUMBER() OVER (PARTITION BY mr_no ORDER BY admit_date) AS visit_seq FROM your_visit_table -- 替换为你的表名 ), psych_prev_visits AS ( SELECT pv.*, -- 查找当前就诊前3次范围内的最近一次精神科就诊出院日期 (SELECT MAX(prev.dischg_date) FROM patient_visits prev WHERE prev.mr_no = pv.mr_no AND prev.visit_seq BETWEEN pv.visit_seq - 3 AND pv.visit_seq - 1 AND prev.is_psych = 1) AS last_psych_discharge FROM patient_visits pv ) SELECT mr_no, admit_date, dischg_date, pat_status, -- 最终判断再入院标记 CASE WHEN is_psych = 1 AND last_psych_discharge IS NOT NULL AND DATEDIFF(pv.admit_date, last_psych_discharge) < 30 THEN 'Y' ELSE 'N' END AS Readmit FROM psych_prev_visits pv -- 可选:筛选特定患者 WHERE mr_no = 'target_mr_number' ORDER BY mr_no, admit_date;
关键优化点
- 用
ROW_NUMBER()生成就诊序号,精准锁定当前就诊的前3次范围 - 通过子查询提取前3次范围内最近的精神科就诊出院日期,而非仅判断存在性
- 明确用
DATEDIFF(当前入院日期, 上次精神科出院日期)计算间隔,确保逻辑正确 - 分层CTE让逻辑更清晰,便于调试
内容的提问来源于stack exchange,提问作者oscarmnz8
相关产品推荐
相关产品推荐

