计算和聚合两行

时间:2015-03-05 23:32:43

标签: 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

如果user_id低于120且bp_systolic低于80,我将如何计算所有bp_diastolic

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

2 个答案:

答案 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;