仅选择某些列仅包含特定值的ID

时间:2018-08-22 10:00:34

标签: sql postgresql select

我有下表示例:

输入:

ID | event_type | event_value | time
---+------------+-------------+-------
1  |     A      |   sinus     | 14:23  <- select ID = 1
1  |     A      |   sinus     | 15:22
1  |     B      |   low WC    | 15:22
1  |     A      |   sinus     | 16:22
1  |     C      |   RX OK     | 17:22
.
2  |     A      |   sinus     | 14:23  
2  |     A      |  arrhytm    | 15:22 <- DON'T select ID = 2
2  |     B      |   low WC    | 15:22
2  |     A      |   sinus     | 16:22
.
3  |     A      |   sinus     |  12:32 <- select ID = 3
3  |     B      |   WC ok     |  13:23
3  |     C      |   ph ok     |  13:40
3  |     A      |   sinus     |  13:33
3  |     A      |   sinus     |  14:22

输出:

ID 
---
 1
 3

我只想选择对于给定ID,所有event_type A条目都具有event_value ='sinus'的ID。 我该怎么办?

非常感谢!

4 个答案:

答案 0 :(得分:1)

在表名方面没有确切的细节,但是您似乎想检查该ID / Event_type是否不存在其他任何内容。

SELECT * 
FROM yourTable a
WHERE a.event_type = 'A' 
AND not exists (SELECT 1 
                  FROM yourTable b 
                  WHERE a.ID = b.ID 
                  AND a.event_type = b.event_type 
                  AND b.event_value <> 'sinus')

然后需要根据需要的输出对结果进行分组/汇总,问题中未显示。

答案 1 :(得分:1)

使用布尔聚合bool_and().

$resolver->setDefaults([
    'data_class' => BitcoinRateSetting::class,
    'validation_groups' => ['bitcoinRateDefault'],
    'cascade_validation' => true,
]);

或者用with my_table(id, event_type, event_value, time) as ( values (1, 'A', 'sinus', '14:23'), (1, 'A', 'sinus', '15:22'), (1, 'B', 'low WC', '15:22'), (1, 'A', 'sinus', '16:22'), (1, 'C', 'RX OK', '17:22'), (2, 'A', 'sinus', '14:23'), (2, 'A', 'arrhytm', '15:22'), (2, 'B', 'low WC', '15:22'), (2, 'A', 'sinus', '16:22') ) select id from my_table group by id having bool_and(event_type <> 'A' or event_value = 'sinus') id ---- 1 (1 row) 子句:

WHERE

答案 2 :(得分:1)

一种方法:

 Select id from  table 
 where event_type ='A' 
 group by id 
 having 
 min(event_value) = 'sinus'
 and 
 max(event_value)  = 'sinus'

答案 3 :(得分:1)

我将GROUP BYHAVING子句一起使用:

select t.id
from table t
where t.event_type = 'A'
group by t.id
having min(t.event_value) = max(t.event_value) and min(t.event_value) = 'sinus';