说我有一张如下表:
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
如果user_id
低于120且bp_systolic
低于80,我将如何计算所有bp_diastolic
?
我无法弄清楚如何做到这一点,因为条件适用于单个用户的两个不同的行。事实上,我甚至缺乏形成相关网络搜索的话语。
答案 0 :(得分: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;
只有在缺少两个密钥之一的用户时才需要HAVING
子句。
答案 1 :(得分:4)
您可以在having
子句中使用条件聚合执行此操作,假设每个用户只有两个读数。
select user_id
from table t
group by user_id
having sum(case when key = 'bp_systolic' then value end) < 120 and
sum(case when key = 'bp_diastolic' then value end) < 80;