如何在同一张患者记录表中筛选符合绩效分差值条件的出入院记录
问题分析
你遇到的核心问题是:INNER JOIN会将匹配的EX和EN记录合并到同一行,而你需要的是将它们作为独立的行输出。另外你尝试的UNION ALL写法有误,因为外层查询无法引用子查询中的a和b别名(子查询的作用域仅限于自身)。
解决方案
这里提供两种可靠的方法来得到你想要的结果:
方法一:先筛选符合条件的ID,再提取对应记录
这种方法先找出所有满足「出院绩效分低于入院绩效分」的患者ID,然后从原表中取出这些ID的所有出入院记录:
SELECT * FROM My_table WHERE ID IN ( SELECT a.ID FROM My_table a INNER JOIN My_table b ON a.ID = b.ID WHERE a.TYPE = 'EX' AND b.TYPE = 'EN' AND a.PERFORMANCE_SCORE < b.PERFORMANCE_SCORE -- 等价于差值为负 ) ORDER BY ID, TYPE DESC; -- 按ID分组,EX记录在前,EN在后,可根据需求调整排序规则
说明:子查询中通过关联同一个表的EX和EN记录,筛选出出院分低于入院分的ID;外层查询则取出这些ID的所有记录,最终得到符合要求的记录对。
方法二:用UNION ALL分别提取EX和EN记录
这种方法直接查询符合条件的EX记录和对应的EN记录,再用UNION ALL合并成独立的行:
-- 提取符合条件的出院记录 SELECT a.* FROM My_table a INNER JOIN My_table b ON a.ID = b.ID WHERE a.TYPE = 'EX' AND b.TYPE = 'EN' AND a.PERFORMANCE_SCORE < b.PERFORMANCE_SCORE UNION ALL -- 提取对应的入院记录 SELECT b.* FROM My_table a INNER JOIN My_table b ON a.ID = b.ID WHERE a.TYPE = 'EX' AND b.TYPE = 'EN' AND a.PERFORMANCE_SCORE < b.PERFORMANCE_SCORE ORDER BY ID, TYPE DESC;
说明:第一个查询块获取所有满足条件的EX记录,第二个查询块获取对应的EN记录,UNION ALL会保留所有行(这里不会有重复),最后排序让同一患者的记录相邻。
额外提示
如果你的数据中存在一个患者有多组出入院记录的情况,建议在关联时增加日期匹配条件(比如将每个EX记录关联到其之前最近的EN记录),避免错误匹配。例如:
SELECT a.* FROM My_table a INNER JOIN My_table b ON a.ID = b.ID AND a.DATE > b.DATE -- 确保出院日期晚于入院日期 WHERE a.TYPE = 'EX' AND b.TYPE = 'EN' AND a.PERFORMANCE_SCORE < b.PERFORMANCE_SCORE
内容的提问来源于stack exchange,提问作者kumv556
相关产品推荐
相关产品推荐

