我找不到具有这些特征的类似问题,如果重复出现,我将关闭该问题。
想象一下我在PostgreSQL数据库中有下表:
| serverdate | colA | colB | colC | colD
|-------------------------------------------
0 | 2019-12-01 | a | OK | 10 | string1
1 | 2019-12-02 | a | OK | 10 | string2
2 | 2019-12-02 | a | NOK | 100 | string3
3 | 2019-12-01 | b | OK | 0 | string1
4 | 2019-12-03 | b | OK | 1 | string1
5 | 2019-12-05 | c | NOK | 0 | string2
5 | 2019-12-07 | d | OK | 10 | string3
5 | 2019-12-08 | d | EX | 1000 | string4
5 | 2019-12-12 | e | OK | 1 | string5
我想选择所有符合以下条件的行(我不知道该如何精确表达该条件,一个例子更加清晰):
对于colA中的所有组,请检查colB中是否存在NOK。如果分组中有任何NOK,请不要选择该分组中的任何行
例如,对于提到的表,结果将是:
| serverdate | colA | colB | colC | colD
|-------------------------------------------
3 | 2019-12-01 | b | OK | 0 | string1
4 | 2019-12-03 | b | OK | 1 | string1
5 | 2019-12-07 | d | OK | 10 | string3
5 | 2019-12-08 | d | EX | 1000 | string4
5 | 2019-12-12 | e | OK | 1 | string5
有关如何执行此查询的任何想法?建议保持简洁性。
谢谢!
答案 0 :(得分:2)
NOT EXISTS
是一种规范的解决方案:
select t.*
from t
where not exists (select 1
from t t2
where t2.cola = t.cola and t2.colb = 'NOK'
);
答案 1 :(得分:1)
也许窗口功能可以帮助您
SELECT cola, colb, ...
FROM (SELECT cola, colb, ...,
bool_or(colb = 'NOK')
OVER (PARTITION BY cola) AS hasnok
FROM tab) AS q
WHERE NOT hasnok;