4. 患者主索引与跨表身份对齐

在多表临床数据关联分析中,最基础也最容易出错的一步,是把分散在不同业务表里的记录归并到同一个“患者”身上。医院信息系统通常按业务过程建表:挂号系统记录病历号,检验系统记录就诊流水号,影像系统可能只保留住院号,而病案首页又同时出现身份证号与病案号。这些标识符各自服务于不同业务,彼此之间没有天然的强绑定关系。如果直接按某一列做连接,往往会出现同一患者被拆成多条、或不同患者被错误合并的情况。因此,需要先建立患者主索引(EMPI,Enterprise Master Patient Index),再以主索引为锚点完成跨表身份对齐。

三类标识符的语义与稳定性差异

理解标识符的语义,是设计对齐规则的前提。临床数据中常见的身份标识大致可分为三类:

  • 身份证号:全局唯一、跨机构稳定,是身份对齐的黄金标识。但存在缺失、脱敏、录入错误(如末位校验位不符)等问题,不能假设其完整可用。
  • 病历号(病案号):通常由医院或院区分配,在院内相对稳定,但患者转院、重复建档、合并档案时可能产生多个病历号。
  • 就诊流水号:一次就诊一个号,粒度最细、稳定性最低,只能用于定位“某次就诊”,不能直接作为患者身份标识。

三者的关系可以概括为:身份证号指向“人”,病历号指向“人在某机构的档案”,就诊流水号指向“人的某一次就诊”。跨表归并的目标,是把后两者收敛到前者所代表的患者维度上。

患者主索引(EMPI)跨表身份对齐结构 挂号表 病历号 · 姓名 · 身份证号 检验表 就诊流水号 · 病历号 · 项目 影像表 住院号 · 检查号 · 报告 病案首页 病案号 · 身份证号 · 住院号 用药医嘱表 就诊流水号 · 药品 · 剂量 标识符映射层 身份证号 全局唯一 · 强标识 病历号 / 病案号 院内稳定 · 中标识 就诊流水号 单次就诊 · 弱标识 规则:强标识优先,弱标识辅助 冲突时人工复核 患者主索引 EMPI EMPI_ID: P0001 身份证: 3301**********1234 EMPI_ID: P0002 身份证: 3301**********5678 EMPI_ID: P0003 身份证: 3301**********9012 对齐顺序:身份证号精确匹配 → 病历号+姓名辅助匹配 → 就诊流水号串联就诊记录 输出:每条业务记录附加唯一 EMPI_ID,实现患者维度归并

对齐策略:从强到弱的分层匹配

实际工程中,推荐采用“强标识优先、弱标识辅助、冲突人工复核”的分层策略。具体执行顺序如下:

  1. 第一层:身份证号精确匹配。对身份证号做标准化处理——去除空格、统一大小写、校验末位校验码。校验通过的记录直接按身份证号归并到同一 EMPI_ID。这一层能覆盖大部分有完整身份证信息的记录。
  2. 第二层:病历号 + 姓名 + 出生日期组合匹配。对于身份证缺失的记录,用病历号作为主键,辅以姓名和出生日期做交叉验证。若同一病历号下姓名和出生日期一致,则归入同一患者;若不一致,说明可能存在重复建档或档案合并,需标记为待复核。
  3. 第三层:就诊流水号串联。就诊流水号本身不用于患者身份判定,但可用于把同一次就诊下的检验、医嘱、影像记录串联起来,再通过该次就诊关联到的病历号回溯到患者。
关键原则:身份证号是唯一可以单独作为患者身份判定的标识符。病历号和就诊流水号必须结合其他字段使用,不能单独作为归并依据。

实现过程:以 SQL 为例的归并逻辑

假设已有挂号表 reg、检验表 lab、病案首页 mr,需要生成患者主索引并给各表打上 EMPI_ID。核心思路是先用身份证号建立主索引,再用病历号做补充映射。

-- 第一步:从挂号表和病案首页提取身份证号,建立初始主索引
CREATE TABLE empi AS
SELECT
    ROW_NUMBER() OVER (ORDER BY id_card) AS empi_id,
    id_card,
    MIN(name) AS name,
    MIN(birth_date) AS birth_date
FROM (
    SELECT id_card, name, birth_date FROM reg WHERE id_card IS NOT NULL
    UNION
    SELECT id_card, name, birth_date FROM mr WHERE id_card IS NOT NULL
) t
GROUP BY id_card;

-- 第二步:建立病历号到 EMPI_ID 的映射
CREATE TABLE mrn_map AS
SELECT DISTINCT
    r.mrn,
    e.empi_id
FROM reg r
JOIN empi e ON r.id_card = e.id_card
WHERE r.id_card IS NOT NULL;

-- 第三步:对无身份证的记录,通过病历号映射补充 EMPI_ID
UPDATE lab l
SET empi_id = m.empi_id
FROM mrn_map m
WHERE l.mrn = m.mrn AND l.empi_id IS NULL;

-- 第四步:标记仍无法归并的记录,进入人工复核队列
SELECT * FROM lab WHERE empi_id IS NULL;

上述示例中,empi_id 是系统生成的代理键,与业务标识符解耦,便于后续扩展。执行完成后,检验表中原本只有就诊流水号和病历号的记录,被赋予了统一的 EMPI_ID,从而可以与挂号表、病案首页按患者维度关联。

冲突处理与质量校验

归并过程中最常见的冲突有三类:一是同一身份证号对应多个姓名,通常由姓名录入错误或曾用名导致;二是同一病历号对应多个身份证号,可能涉及冒用或档案合并;三是同一患者存在多个病历号,需要判断是否为重复建档。对这三类冲突,建议统一进入待复核表,由人工确认后再更新主索引,而不是在自动流程中强行合并。

质量校验可以从三个指标观察:归并率(成功赋予 EMPI_ID 的记录占比)、冲突率(进入复核队列的记录占比)、以及一对多异常数(一个 EMPI_ID 关联的身份证号或病历号数量超过阈值)。在示例数据规模下,若归并率低于 85% 或冲突率高于 5%,通常说明标识符质量或匹配规则需要调整。

注意:身份证号涉及个人敏感信息,在存储和传输时应做脱敏或加密处理。主索引表中建议只保留身份证号的哈希值或掩码形式,原始值单独加密存放。

归并结果的使用方式

完成身份对齐后,各业务表都带上了统一的 EMPI_ID。后续做多表关联分析时,不再依赖病历号或就诊流水号直接连接,而是统一以 EMPI_ID 为连接键。例如,要查询某患者的检验结果与用药记录,只需按 EMPI_ID 关联检验表和医嘱表,再按就诊流水号对齐到同一次就诊即可。这样既避免了因标识符不一致导致的漏匹配,也降低了因错误匹配引入的噪声。

需要强调的是,患者主索引不是一次性建完就固定不变的。随着新患者建档、旧档案合并、身份证信息补录,主索引需要持续维护。建议在每次批量归并后保留变更日志,记录哪些记录被赋予了新的 EMPI_ID、哪些发生了合并,以便追溯和回滚。