sql - 选择列中包含列表中所有值的所有行

标签 sql postgresql relational-division

很抱歉没有更好的问题标题,如果有人知道我正在尝试做的事情的 SQL 行话,我会更改它以使其可用于 Google。

我有一张来自医院的下表。

 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 两次)。

最佳答案

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

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

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

关于sql - 选择列中包含列表中所有值的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49901340/

相关文章:

复杂搜索的 SQL 语法

mysql - 在 MySQL 中查找字符串时遇到一些麻烦

java - 找出谁删除了数据库中的行

sql - 修复运行缓慢的SQL查询

sql - PostgreSQL NOT IN 不能与 JOIN 一起正常工作

sql - 使用 INTERSECT 或 HAVING 简化和/或优化 sql 查询

mysql - 将 id 替换为数据库中的名称

sql - 索引所有作为表外键的列

postgresql - 调整两列与一组整数的比较

SQL,获取所有自定义数据类型的列表