按两行计数和聚合
Counting and aggregating by two rows
假设我有一个 table 如下所示:
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_diastolic
小于 80 的所有 user_id
?
我不知道该怎么做,因为该条件适用于单个用户的两个不同行。事实上,我什至缺乏形成相关网络搜索我想要的东西的词。
您可以在 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;
如果我们知道每个 (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
子句。
假设我有一个 table 如下所示:
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_diastolic
小于 80 的所有 user_id
?
我不知道该怎么做,因为该条件适用于单个用户的两个不同行。事实上,我什至缺乏形成相关网络搜索我想要的东西的词。
您可以在 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;
如果我们知道每个 (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
子句。