【MIMIC数据库教程】二、MIMIC-IV3.1表格与字段详解(二):Hosp住院模块表格详解(上)


MIMIC-IV 3.1 表格与字段详解(二):Hosp 住院模块表格详解(上)

摘要: MIMIC-IV 是一个关系数据库,包含美国马萨诸塞州某三级学术医疗中心的住院患者数据。它继承 MIMIC-III 的基础,提供更丰富的数据,包括实验室测量、用药、生命体征记录等,支持医疗健康研究。但大量繁琐的表格极大地增加了数据处理的难度,本教程将详细介绍 MIMIC-IV 3.1 版本中包含的 31 张表格及其字段,帮助读者更好地理解和使用 MIMIC-IV 数据库。我将在本专栏中持续更新 MIMIC-IV 数据库的详细解读和数据挖掘,敬请关注!


数据模块概述

MIMIC-IV 3.1 版本包含 住院 (hosp) 和 重症监护 (ICU) 两个模块的数据:

  • Hosp: 提供全院电子病历数据,包括入院信息、实验室测量、微生物学、用药、账单等,共计 22 张表
  • ICU: 记录重症监护室数据,如静脉注射、呼吸机设置、生命体征等,共计 9 张表
    在之前的文章【MIMIC数据库教程】一、MIMIC-IV3.1表格与字段详解(一)中整体性的介绍了Hosp和ICU模块中的所有表格,本文将开始对这些表格详细介绍和解读。

🏥 Hosp:admissions表格

admissions表格提供了病人入院的相关信息,总共包含546028行,16个字段,其中hadm_id字段(住院号)为数据库主键(唯一),其余字段含义如下:

列名 字段含义 变量类型 缺失值数量
subject_id 患者ID 整数 0
hadm_id 住院号 整数 0
admittime 入院时间 时间 0
dischtime 出院时间 时间 0
deathtime 死亡时间 时间 534238
admission_type 入院紧急程度 字符串 0
admit_provider_id 收治病人的医护人员ID 字符串 4
admission_location 病人入院前的位置信息 字符串 1
discharge_location 病人出院后的地址 字符串 149818
insurance 保险 字符串 9355
language 语言 字符串 775
marital_status 婚姻状况 字符串 13619
race 种族 字符串 0
edregtime 进急诊科时间 时间 166788
edouttime 出急诊科时间 时间 166788
hospital_expire_flag 是否在住院期间死亡 bool 0

🏥 Hosp:d_hcpcs表格

d_hcpcs表格包含hcpcsevents表中CPT代码的可读定义,总共包含89208行,4个字段,其中code字段(CPT编码)为数据库主键(唯一),其余字段含义如下:

<think>好的,我现在需要帮助用户解决他们在使用MIMIC-IV 3.1数据库时遇到的SQL语法错误和列名不存在的问题。首先,我需要仔细分析用户的问题描述,他们提到两个错误:一个是“syntax error at or near ORDER”,另一个是列名“p.hadm_id”不存在,应该使用“proc.hadm_id”。同时,用户还引用了之前的一些回答和相关资料,我需要参考这些信息来提供准确的解决方案。 首先,关于“syntax error at or near ORDER”的问题。根据之前的回答,用户可能是在编写SQL查询时,ORDER BY子句的位置不正确,或者在之前的语句中存在括号未闭合的情况。例如,在WHERE子句中可能缺少右括号,导致ORDER BY被错误解析。我需要检查用户提供的SQL代码,看看是否存在这样的问题。另外,用户提到的列名错误“p.hadm_id”不存在,而应该使用“proc.hadm_id”,这可能是因为在JOIN操作中,用户错误地引用了表的别名。 接下来,我需要回顾用户提供的引用内容,尤其是关于MIMIC-IV数据库结构的教程,比如Hosp模块表格详解。用户引用的教程中提到,Hosp模块包括patients、procedures_icd等表格,需要确认这些表格字段是否正确。例如,检查procedures_icd表是否有hadm_id字段,以及是否在JOIN时正确关联了subject_id和hadm_id。 用户之前的问题中已经给出了修正后的骨科手术查询代码,但可能还存在错误。例如,在JOIN patients表时,可能只使用了subject_id进行连接,而没有考虑到hadm_id的必要性,导致后续引用p.hadm_id时出错,因为patients表中可能没有hadm_id字段,而hadm_id存在于admissions表中。因此,正确的做法应该是从procedures_icd表中直接获取hadm_id,或者通过admissions表来关联。 此外,用户提供的引用中提到了使用Python读取MIMIC-IV数据库的方法,但当前的问题集中在SQL查询上,暂时不需要涉及Python部分。不过,可能需要提醒用户在数据处理阶段如果遇到大型表格,可以考虑分块读取等方法。 现在需要具体解决用户的错误。首先,关于ORDER BY附近的语法错误,需要检查WHERE子句中的括号是否正确闭合。例如,用户之前的查询可能在WHERE子句中有多个OR条件,但未正确闭合括号,导致ORDER BY被误认为属于WHERE子句的一部分。修正方法是确保所有括号正确闭合。 其次,关于列名p.hadm_id不存在的问题,需要确认patients表中是否存在hadm_id字段。根据MIMIC-IV的结构,patients表存储的是患者的基本信息,如subject_id、出生日期、性别等,而hadm_id(住院ID)通常存储在admissions表中。因此,在查询住院相关的信息时,需要从procedures_icd表或admissions表中获取hadm_id,而不是patients表。因此,用户可能在JOIN时错误地引用了patients表的hadm_id,而实际上应该使用procedures_icd表中的hadm_id,因为procedures_icd表已经包含hadm_id字段,或者需要通过admissions表来关联。 因此,修正方案应该是:在SELECT子句中,使用proc.hadm_id而不是p.hadm_id,因为procedures_icd表(别名为proc)已经包含hadm_id字段,不需要通过patients表获取。同时,检查JOIN条件是否正确关联了subject_id和hadm_id,如果需要的话,可能需要引入admissions表进行连接。 最后,需要确保所有JOIN操作都正确关联了所需的字段,并且WHERE子句中的条件正确闭合,避免语法错误。此外,提醒用户在编写SQL时注意字段的来源表,避免引用不存在的列。 总结解决方案步骤: 1. 检查并修正WHERE子句中的括号闭合问题,确保ORDER BY正确放置。 2. 将p.hadm_id替换为proc.hadm_id,因为procedures_icd表包含该字段3. 确保JOIN操作正确关联了subject_id和hadm_id,必要时引入admissions表。 4. 验证所有字段的来源表,避免引用不存在的列。</think>### 一、错误原因分析 #### 1. `syntax error at or near "ORDER"` - **根本原因**:WHERE条件中多条件组合**未正确闭合括号**,导致SQL解析器误判ORDER BY子句位置 - **典型错误示例**: ```sql WHERE (cond1 OR cond2 -- 缺少闭合括号 ORDER BY ... ``` #### 2. `column p.hadm_id does not exist` - **数据结构特性**: - `mimiciv_hosp.patients`表仅包含患者基础信息(`subject_id`、出生日期、性别等)[^2] - **hadm_id(住院号)存储于`admissions`表**和临床操作相关表(如`procedures_icd`) - **错误根源**:尝试从patients表获取住院号导致列不存在 $$ \begin{aligned} &\text{正确数据流向} \\ &\text{procedures_icd} \xrightarrow{\text{hadm\_id}} \text{admissions} \xrightarrow{\text{subject\_id}} \text{patients} \end{aligned} $$ ### 、修正方案 #### 修正后的骨科手术查询代码: ```sql SELECT proc.subject_id, proc.hadm_id, -- 直接从procedures_icd表获取 proc.icd_code, di.long_title AS procedure_name, proc.chartdate FROM mimiciv_hosp.procedures_icd proc INNER JOIN mimiciv_hosp.d_icd_procedures di ON proc.icd_code = di.icd_code AND proc.icd_version = di.icd_version WHERE (proc.icd_code LIKE &#39;0PQ%&#39; -- 关节置换 OR proc.icd_code LIKE &#39;0PS%&#39; -- 脊柱手术 OR proc.icd_code LIKE &#39;0PU%&#39; -- 上肢手术 OR proc.icd_code LIKE &#39;0PT%&#39; -- 下肢手术 OR proc.icd_code LIKE &#39;0P7%&#39;) -- 注意闭合括号 AND proc.icd_version = 10 ORDER BY proc.chartdate DESC; -- 正确结束位置 ``` ### 三、关键改进点 1. **数据源优化**: - 直接使用`procedures_icd.hadm_id`字段(已包含住院号) - 移除冗余的patients表连接(除非需要性别/年龄等基础信息) 2. **括号完整性验证**: ```diff - WHERE (cond1 OR cond2 + WHERE (cond1 OR cond2) ``` 3. **编码版本过滤**: - 添加`proc.icd_version=10`明确限定ICD-10-PCS编码 ### 四、扩展验证方法 1. **字段存在性检查**: ```sql SELECT column_name FROM information_schema.columns WHERE table_name = &#39;procedures_icd&#39; AND column_name = &#39;hadm_id&#39;; -- 返回hadm_id则确认字段存在[^2] ``` 2. **执行计划验证**: ```sql EXPLAIN ANALYZE SELECT ... -- 粘贴完整查询语句 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值