计算和聚合两行

yal*_*tar 1 sql postgresql aggregate-functions

假设我有一个如下表:

id  | key           | user_id | value
---------------------------------------
8   | bp_diastolic  | 1       | 93.0
7   | bp_systolic   | 1       | 128.0
20  | bp_systolic   | 2       | 108.0
21  | bp_diastolic  | 2       | 76.0
35  | bp_diastolic  | 3       | 113.0
34  | bp_systolic   | 3       | 101.0
48  | bp_systolic   | 4       | 115.0
49  | bp_diastolic  | 4       | 77.0
62  | bp_systolic   | 5       | 143.0
63  | bp_diastolic  | 5       | 104.0
77  | bp_diastolic  | 6       | 108.0
76  | bp_systolic   | 6       | 144.0
90  | bp_systolic   | 7       | 122.0
91  | bp_diastolic  | 7       | 81.0
105 | bp_diastolic  | 8       | 110.0
104 | bp_systolic   | 8       | 146.0
118 | bp_systolic   | 9       | 141.0
119 | bp_diastolic  | 9       | 72.0
132 | bp_systolic   | 10      | 120.0
133 | bp_diastolic  | 10      | 107.0
Run Code Online (Sandbox Code Playgroud)

如何计算低于120且低于80的所有user_ids ?bp_systolicbp_diastolic

我无法弄清楚如何做到这一点,因为条件适用于单个用户的两个不同的行.事实上,我甚至缺乏形容相关的网络搜索我想要的东西.

Erw*_*ter 5

如果我们知道每个条目最多只有一个条目(user_id, key)- 可以通过约束来保证UNIQUE (user_id, key),这应该是最快的::

SELECT user_id
FROM   tbl
WHERE  key = 'bp_systolic' AND value < 120 OR
       key = 'bp_diastolic' AND value < 80
GROUP  BY 1
HAVING count(*) = 2;
Run Code Online (Sandbox Code Playgroud)

HAVING只有在缺少两个密钥之一的用户时才需要该子句.