相关文章推荐
忐忑的黑框眼镜  ·  libicui18n.so.52 ...·  1 年前    · 
酷酷的茶叶  ·  ADB ...·  3 天前    · 
爽快的哑铃  ·  reactjs - Type '{ ...·  1 年前    · 
纯真的包子  ·  Linux中root安装microsoft ...·  1 年前    · 
首发于 科研收录
MIMIC数据提取教程 - 提取患者首次入ICU数据

MIMIC数据提取教程 - 提取患者首次入ICU数据


一、提取患者首次入ICU信息





思路:

  1. 患者入ICU信息存储在mimic_icu.icustays表中,intime为患者入ICU的时间。我们的思路是根据患者的subject_id分组 (分组SQL我们一般使用:group by 或者 partition by )
  2. 然后以intime升序排序,看每行记录对应的是该患者第几次入ICU,
  3. 最后取第一次入ICU的,即为首次入ICU信息。


比如233患者三次入ICU,我们需要根据入ICU时间intime从小到大生成排名,也就是入ICU顺序



这里stay_id 410这条就是患者233首次入icu的信息

为了实现这个思路,我们需要用到row_number()排名函数,用SQL实现如下



这个SQL的意思是:以subject_id分组,每组以intime从小到大排序,生成排名,比如该subject_id下最小的intime所在的这一行,排名设为1。



  • 按照subject_id分组: partition by用来对表分组,在这个例子中,所以我们指定了按“subject_”分组(partition by subject_id)
  • 按intime排名: order by子句的功能是对分组后的结果进行排序,默认是按照升序(asc)排列, 在本例中(order by intime)是按intime这一列排序,加了desc关键词表示降序排列。

通过下图,我们就可以理解partiition by(分组)和order by(在组内排序)的作用了。



接着,我们需要从这个查询的结果中取stay_order=1的,那么如何从这些查询结果中再查询数据呢?有很多种方式都可以实现,比如将上述查询的结果创建成表、物化视图、或者用子查询,这里介绍一个比较优雅的常用的方案,with子句。

with可以将查询结果作为一个临时表,供后续查询复用该临时表,这样可以将复杂的大型查询分解为多次简单查询

用SQL实现提取首次入ICU信息:

WITH stay_order_view AS (
        SELECT
                subject_id,
                hadm_id,
                stay_id,
                intime,
-- 以subject_id分组, 每组以intime从小到大排序(默认升序),生成排名
                ROW_NUMBER ( ) OVER ( PARTITION BY subject_id ORDER BY intime ) AS stay_order 
                mimiciv_icu.icustays