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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:42:29