1. 临床数据查询工程导论
临床数据查询工程,是把散落在不同业务系统里的诊疗记录,转化为可被稳定、可复现、可审计地检索与计算的数据产品的过程。它既不是单纯的 SQL 技巧,也不是一次性的取数任务,而是一套围绕“数据来源—查询语义—工程约束—交付形态”建立起来的系统方法。理解这一点,是后续所有章节的起点。
一、临床数据从哪里来
一家三级医院的临床数据通常分布在多个异构系统中,每个系统的数据模型、主键体系和时间语义都不相同:
- HIS(医院信息系统):挂号、就诊、收费、医嘱主记录。核心表如就诊记录、患者主索引,通常以“就诊号”为业务主键。
- EMR(电子病历):入院记录、病程记录、手术记录、出院小结,多为半结构化文本或富文本段落。
- LIS(检验系统):检验申请、标本、结果明细。一条检验项目对应一行结果,含检验值、单位、参考区间、异常标志。
- RIS/PACS(影像系统):检查申请、报告文本、影像索引,图像本身一般不进入查询链路。
- 护理与体征系统:体温单、生命体征、出入量,按时间点高频采集。
- 病案首页与医保结算:诊断编码(ICD-10)、手术操作编码(ICD-9-CM-3)、费用分类,是科研队列筛选的常用入口。
这些系统之间靠患者主索引(EMPI)和就诊号做关联,但关联质量参差不齐:同一患者可能因姓名同音、证件号缺失而产生重复主索引;一次住院在 HIS 是一个就诊号,在 LIS 却按标本号拆分。因此,任何复杂查询的第一步,往往不是写 SQL,而是确认“我要的这条记录,在源系统里用什么键唯一定位”。
二、什么算“复杂查询”
复杂查询的“复杂”不体现在 SQL 长度,而体现在语义层次。可以按四个维度判断:
| 维度 | 简单查询 | 复杂查询 |
|---|---|---|
| 对象 | 单表、单患者 | 多表关联、跨系统、群体队列 |
| 时间 | 某一时点值 | 时间窗、序列、首次/末次、持续时长 |
| 逻辑 | 等值过滤 | 存在性、嵌套、窗口函数、集合运算 |
| 结果 | 明细列表 | 指标聚合、分层统计、可复现数据集 |
例如“找出 2023 年所有在 ICU 住院超过 48 小时、且住院期间至少一次血乳酸大于 4 mmol/L 的脓毒症患者”,就同时涉及:诊断编码筛选、ICU 转入转出时间计算、检验结果时间对齐、阈值判断与去重。这类查询才是本课程要解决的对象。
三、工程化挑战
把上述查询写成一次性 SQL 并不难,难的是让它在下个月、换一个人、换一批数据时仍然正确。主要挑战有:
- 时间语义不一致:医嘱开立时间、执行时间、计费时间、检验采样时间与报告时间各不相同。选错时间字段,队列就会偏移。
- 数据质量:单位不统一(血糖 mg/dL 与 mmol/L)、参考区间随年龄性别变化、结果存在“<0.05”这类非数值文本。
- 可复现性:查询依赖临时表、手工导出、Excel 二次加工,导致结果无法回溯。
- 性能与合规:千万级检验明细上的多表关联容易超时;同时患者隐私要求最小必要字段访问与脱敏。
四、课程实战路线图
本课程按“数据—语义—实现—交付”四层推进,共 30 章。前段建立数据模型与时间口径认知,中段训练多表关联、窗口函数、存在性判断等核心查询能力,后段进入性能优化、结果校验与可复现交付。每一章都围绕一个真实临床问题展开,而不是孤立讲解语法。
五、从“会写 SQL”到“能交付查询”
本课程的目标不是让你记住更多函数,而是建立一套可迁移的工作习惯:先明确临床问题对应的数据对象与时间口径,再设计查询结构,最后用校验规则确认结果合理。例如上面那条脓毒症队列查询,交付时至少应附带:诊断编码版本、ICU 时长计算方式(转入时间到转出时间,缺失转出按出院时间)、乳酸单位换算规则、以及排除重复就诊的逻辑。这些内容会在后续章节逐一展开。
临床数据查询工程的价值,在于把一次性的“取数”变成可复用、可审计、可解释的数据能力。接下来的章节,将从数据模型与时间口径这两个最基础也最容易出错的地方开始。