2015-03-05 3 views
1

Скажем, у меня есть таблица вроде следующего:Counting и агрегирование двумя рядами

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 с с bp_systolic ниже 120 и bp_diastolic менее чем 80?

Я не могу понять, как это сделать, поскольку это условие применимо к двум различным строкам для одного пользователя. На самом деле мне не хватает слов, чтобы сформировать соответствующий веб-поиск того, что я хочу.

+0

Всегда ли * точно * две строки на пользователя (одна диастолическая, одна систолическая)? И вы хотите только считать 'user_id', который активно выполняет оба критерия - или это отсутствие каких-либо обидных строк? –

ответ

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; 
+1

Вещь красоты! – yalestar

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 только необходимо, если могут отсутствовать пользователи с одним из двух ключей.

Смежные вопросы