选择列中包含列表

时间:2018-04-18 13:44:21

标签: sql postgresql relational-division

对于缺少一个更好的问题标题感到抱歉,如果有人知道我试图使其成为谷歌能力的SQL术语,我会改变它。

我有一张医院的下表。

 subject_id | hadm_id | icd9_code 
------------+---------+-----------
          3 |  145834 | 5849
          3 |  145834 | 4280
          9 |  150750 | 5849
          9 |  150750 | 4019
          9 |  150750 | 4280
         12 |  112213 | 4019
         13 |  143045 | 4019
         13 |  143045 | 25000
         13 |  143045 | 41401
         17 |  161087 | 2724
         17 |  194023 | 2724

其中subject_id对于患者是唯一的,hadm_id是患者入院(住院)所特有的。每个icd9_code代表一种疾病。因此,例如,3号病人在他们唯一的住院时间内被诊断出患有两种疾病(5849和4280)。

我给出了疾病代码列表,我需要返回已被诊断为至少所有这些疾病的患者名单。

请注意,同一患者可能会重复诊断(例如,患者17在两次不同的住院时间内被诊断患有疾病2724两次)。

2 个答案:

答案 0 :(得分:2)

您可以使用Postgres的数组处理:

select subject_id
from the_table
group by subject_id
having array_agg(distinct icd9_code) @> array[4280, 5849];

array_agg()收集每个subject_id的所有代码,运算符@>检查该数组是否包含其他表达式中的所有元素。

答案 1 :(得分:1)

您可以使用给定的疾病列表筛选患者,并检查疾病的独特数量是否与每次住院时提供的清单计数相符:

select subject_id, hadm_id 
from your_table
where icd9_code in (5849, 5850, 5851)
group by subject_id, hadm_id 
having count(distinct icd9_code) = 3;