首页
/ MIMIC-III数据库SQL入门教程:医疗数据分析基础

MIMIC-III数据库SQL入门教程:医疗数据分析基础

2025-07-10 05:14:02作者:邓越浪Henry

前言

MIMIC-III是一个重要的医疗数据库资源,包含了超过6万例住院患者的去标识化医疗数据。本教程将介绍如何使用SQL语言查询和分析MIMIC-III数据库中的数据,帮助医疗数据分析师和研究人员快速上手。

MIMIC-III数据库概述

MIMIC-III是由MIT计算生理学实验室开发的开放医疗数据集,包含2001-2012年间波士顿贝斯以色列女执事医疗中心的患者数据。数据集涵盖了:

  • 患者人口统计学信息
  • 生命体征记录
  • 实验室检测结果
  • 药物治疗记录
  • 诊断和手术编码

数据以CSV文件格式提供,但通常加载到PostgreSQL等关系型数据库中进行查询和分析。

核心数据表结构

MIMIC-III数据库包含多个相互关联的表,其中三个核心表是:

  1. patients表:记录患者基本信息

    • subject_id:患者唯一标识符(主键)
    • dob:出生日期
    • gender:性别
  2. admissions表:记录住院信息

    • hadm_id:住院记录唯一标识符(主键)
    • subject_id:关联的患者ID(外键)
    • admittime:入院时间
  3. icustays表:记录ICU住院信息

    • icustay_id:ICU住院唯一标识符(主键)
    • hadm_id:关联的住院记录ID(外键)
    • los:住院时长(天)

SQL基础查询

简单SELECT查询

最基本的SQL查询格式是从表中选择特定列:

SELECT 列名1, 列名2
FROM 表名;

例如,查询所有患者ID和出生日期:

SELECT subject_id, dob
FROM patients;

条件查询(WHERE)

使用WHERE子句可以筛选满足特定条件的记录:

SELECT subject_id
FROM patients
WHERE gender = 'F';

排序(ORDER BY)

使用ORDER BY对结果进行排序:

SELECT subject_id, dob
FROM patients
ORDER BY dob DESC;  -- 降序排列

表连接(JOIN)

关系型数据库的核心特性是通过键值关联多个表。MIMIC-III中常用的JOIN操作:

内连接(INNER JOIN)

只返回两个表中匹配的记录:

SELECT p.subject_id, p.dob, a.hadm_id, a.admittime
FROM patients p
INNER JOIN admissions a ON p.subject_id = a.subject_id;

多表连接

可以同时连接多个表:

SELECT pat.subject_id, adm.hadm_id, icu.icustay_id
FROM patients pat
INNER JOIN admissions adm ON pat.subject_id = adm.subject_id
INNER JOIN icustays icu ON adm.hadm_id = icu.hadm_id;

高级SQL功能

列计算与别名

可以对列进行计算并赋予别名:

SELECT icustay_id, round(los) AS los_integer_days
FROM icustays;

条件逻辑(CASE WHEN)

实现if-else逻辑:

SELECT subject_id, los,
    CASE WHEN los < 2 THEN '短期'
         WHEN los BETWEEN 2 AND 7 THEN '中期'
         WHEN los > 7 THEN '长期'
         ELSE '未知' END AS 住院时长分类
FROM icustays;

临时表与视图

使用WITH创建临时查询结果:

WITH patient_age AS (
    SELECT subject_id, 
           (admittime - dob)/365.25 AS age
    FROM admissions a
    JOIN patients p ON a.subject_id = p.subject_id
)
SELECT * FROM patient_age WHERE age > 18;

实战示例:提取血压数据

MIMIC-III中血压数据存储在chartevents表中,我们可以通过以下查询提取:

SELECT ce.subject_id, ce.hadm_id, ce.icustay_id,
       ce.charttime, ce.valuenum AS sbp_value
FROM chartevents ce
WHERE ce.itemid IN (
    SELECT itemid FROM d_items 
    WHERE label LIKE '%血压%收缩压%'
)
AND ce.valuenum IS NOT NULL
ORDER BY ce.subject_id, ce.charttime;

学习建议

  1. 从简单查询开始,逐步增加复杂度
  2. 理解数据库表之间的关系
  3. 使用EXPLAIN分析查询性能
  4. 创建常用查询的视图以便复用
  5. 注意数据类型转换和NULL值处理

通过掌握这些SQL基础,您将能够有效地从MIMIC-III数据库中提取和分析医疗数据,为临床研究和医疗决策提供数据支持。