统计各病症组合的患者数量(Excel/SQL实现咨询)
病症组合患者数统计实现方案(Excel/SQL)
Excel 实现步骤
1. 生成每个患者的唯一病症组合
在空白列(如C2)输入以下公式,下拉应用到所有行:
=TEXTJOIN("",TRUE,SORT(UNIQUE(FILTER(B:B,A:A=A2))))
- 逻辑解析:
FILTER(B:B,A:A=A2):提取当前患者的所有病症记录UNIQUE:去除同一患者的重复病症SORT:按字母排序,确保无序组合格式统一(如CA自动转为AC)TEXTJOIN:将排序后的病症拼接成字符串组合
2. 生成患者-组合的唯一映射并统计
- 复制A列(PatientID)和C列(组合)到新工作表,选择「数据」→「删除重复值」,仅保留
PatientID的唯一行,得到每个患者对应的唯一组合。 - 在新表的空白列(如D2)输入统计公式,下拉应用:
=COUNTIF(C:C,C2)
即可得到每种组合对应的患者数量。
SQL 实现方案
方案1:直接分组拼接(推荐,适用于主流数据库)
通过分组聚合生成每个患者的有序病症组合,再统计组合的出现次数,无需提前生成所有31种组合。
MySQL 8.0+ 示例
SELECT GROUP_CONCAT(DISTINCT `Condition` ORDER BY `Condition` SEPARATOR '') AS condition_combination, COUNT(DISTINCT PatientID) AS patient_count FROM your_table GROUP BY PatientID ORDER BY patient_count DESC;
SQL Server 2017+ 示例
WITH patient_combinations AS ( SELECT PatientID, STRING_AGG(DISTINCT `Condition`, '') WITHIN GROUP (ORDER BY `Condition`) AS condition_combination FROM your_table GROUP BY PatientID ) SELECT condition_combination, COUNT(PatientID) AS patient_count FROM patient_combinations GROUP BY condition_combination ORDER BY patient_count DESC;
PostgreSQL 示例
WITH patient_combinations AS ( SELECT PatientID, STRING_AGG(DISTINCT "Condition", '' ORDER BY "Condition") AS condition_combination FROM your_table GROUP BY PatientID ) SELECT condition_combination, COUNT(PatientID) AS patient_count FROM patient_combinations GROUP BY condition_combination ORDER BY patient_count DESC;
方案2:预生成所有组合再匹配(适合旧版数据库)
如果数据库不支持字符串聚合函数,可先手动生成31种病症组合存入临时表,再关联统计:
- 创建组合表
condition_combinations,插入所有31种有序组合(如A、B、C、AB、AC...ABCDE) - 执行统计查询:
SELECT cc.combination, COUNT(DISTINCT pt.PatientID) AS patient_count FROM condition_combinations cc LEFT JOIN ( SELECT PatientID, GROUP_CONCAT(DISTINCT `Condition` ORDER BY `Condition` SEPARATOR '') AS patient_comb FROM your_table GROUP BY PatientID ) pt ON cc.combination = pt.patient_comb GROUP BY cc.combination ORDER BY patient_count DESC;
- 该方案会列出所有31种组合,包含无患者的组合(显示0),可通过
WHERE patient_count > 0过滤。
内容的提问来源于stack exchange,提问作者OPJayhawk
相关产品推荐
相关产品推荐

