首页 > 解决方案 > 选择分区满足条件的行(PostgreSQL)

问题描述

我找不到具有这些特征的类似问题,如果重复,我将关闭该问题。

想象一下,我在 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

关于如何进行此查询的任何想法?建议简单。

提前致谢!

标签: sqlpostgresqlgrouping

解决方案


NOT EXISTS是一个规范的解决方案:

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.cola = t.cola and t2.colb = 'NOK'
                 );

推荐阅读