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
我无法弄清楚如何做到这一点,因为条件适用于单个用户的两个不同的行.事实上,我甚至缺乏形容相关的网络搜索我想要的东西.
如果我们知道每个条目最多只有一个条目(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只有在缺少两个密钥之一的用户时才需要该子句.
| 归档时间: |
|
| 查看次数: |
41 次 |
| 最近记录: |