ICD编码患者筛选SQL优化请求:重复记录问题排查
解决同时拥有两类ICD编码的患者筛选问题
需求与背景
筛选同时拥有至少1个Group A ICD编码(含E16.2、E16.1等指定编码)和至少1个Group B ICD编码(含E08%、E09%等前缀匹配编码)的患者ID。
数据集:包含ID(患者ID)、DX_CODE(ICD编码)、VISIT_DT(就诊日期)的data_table表。
原SQL问题:使用自连接的查询会因患者存在多个符合条件的编码产生冗余记录,虽用DISTINCT去重,但逻辑冗余且效率偏低,需要优化。
方法1:GROUP BY + HAVING(高效推荐)
通过分组统计每个患者的编码匹配情况,直接筛选同时满足两类编码条件的患者,无需额外去重:
SELECT ID FROM data_table GROUP BY ID HAVING -- 统计该患者拥有的Group A编码数量,至少1个 SUM(CASE WHEN DX_CODE IN ('E16.2', 'E16.1', 'E16.0', 'E11.649', 'E13.641', 'E10.649', 'E15', 'O24.913') THEN 1 ELSE 0 END) > 0 AND -- 统计该患者拥有的Group B编码数量,至少1个 SUM(CASE WHEN DX_CODE LIKE 'E08%' OR DX_CODE LIKE 'E09%' OR DX_CODE LIKE 'E10%' OR DX_CODE LIKE 'E11%' OR DX_CODE LIKE 'E13%' THEN 1 ELSE 0 END) > 0;
优势:
- 仅需扫描表一次,性能远优于自连接方式
- 逻辑直观,直接通过分组统计判断患者是否同时满足两类条件
- 自动确保每个ID只返回一次,无需额外
DISTINCT处理
方法2:EXISTS子查询(逻辑清晰)
通过两个EXISTS子查询分别验证患者是否存在Group A和Group B编码,逻辑更易懂:
SELECT DISTINCT ID FROM data_table t WHERE -- 验证该患者存在至少一个Group A编码 EXISTS ( SELECT 1 FROM data_table WHERE ID = t.ID AND DX_CODE IN ('E16.2', 'E16.1', 'E16.0', 'E11.649', 'E13.641', 'E10.649', 'E15', 'O24.913') ) AND -- 验证该患者存在至少一个Group B编码 EXISTS ( SELECT 1 FROM data_table WHERE ID = t.ID AND (DX_CODE LIKE 'E08%' OR DX_CODE LIKE 'E09%' OR DX_CODE LIKE 'E10%' OR DX_CODE LIKE 'E11%' OR DX_CODE LIKE 'E13%') );
优势:
- 逻辑直白,每个子查询单独验证一类编码的存在性
- 数据库对
EXISTS有专门优化,仅需判断存在性而非返回所有匹配记录
原SQL的问题分析
原自连接查询会对每个患者的Group A编码和Group B编码做笛卡尔积匹配:比如某患者有2个Group A编码、3个Group B编码,会生成6条重复ID的记录,即使加DISTINCT去重,也会额外消耗数据库资源处理这些冗余记录,性能和效率远不如上述两种方法。
内容的提问来源于stack exchange,提问作者Prajwal Mani Pradhan
相关产品推荐
相关产品推荐

