admit/readmit SQL查询未捕获全部readmit记录问题排查
你的查询漏捕获记录的核心问题如下:
- 匹配场景覆盖不全:仅判断了「上次入院在上月、本次入院在当月」的再入院场景,同一个患者两次入院都在当月的场景完全没有覆盖,这是漏数据的最主要原因。
- NULL值判断逻辑错误:
CH1.MedId <> 'NULL'是判断MedId不等于字符串'NULL',如果MedId是数据库标准NULL值,该判断会直接失效,正确写法为CH1.MedId IS NOT NULL。 - 存在不必要的隐式转换:
DATEDIFF函数返回结果为整数,和字符串'30'比较依赖数据库隐式转换,部分场景下会出现判断异常,直接和数字30比较即可。 - 语法细节错误:查询字段
CH3. Status中间多了多余空格,若字段名本身不含空格会触发字段不存在报错。
修正后的查询语句:
SELECT CH3.MedId, CH3.Name, CH3.Description, CH3.StartDate, CH3.EndDate, CH3.Length_of_Stay, CH3.Status, CASE WHEN EXISTS ( SELECT 1 FROM ( -- 合并两个月的所有入院记录,覆盖跨月、同月两种再入院场景 SELECT MedId, StartDate FROM currentmonth UNION ALL SELECT MedId, StartDate FROM previousMonth ) all_admit WHERE all_admit.MedId = CH3.MedId AND all_admit.StartDate < CH3.StartDate AND DATEDIFF(DAY, all_admit.StartDate, CH3.StartDate) <= 30 ) THEN 'Readmit' ELSE 'Admit' END AS Admit_ReAdmit FROM currentmonth CH3 ORDER BY CH3.Name;
修正说明:
- 用
UNION ALL合并当月和上月的所有入院记录,不管两次入院落在同一个月还是跨月,只要时间间隔<=30天都能正常匹配。 - 用
EXISTS替代原来的IN逻辑,匹配效率更高,也避免了IN子查询返回NULL时的逻辑异常问题。 - 直接关联当前行的入院时间和历史入院时间做判断,逻辑更直观准确,不会出现漏匹配的情况。
- 修正了原有查询的NULL判断、数字比较、字段名多余空格等语法问题。
内容的提问来源于stack exchange,提问作者Flashy
相关产品推荐
相关产品推荐

