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

基于前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:10:47