选择分区满足条件的行(PostgreSQL)

时间:2019-12-19 15:16:35

标签: sql postgresql grouping

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

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

有关如何执行此查询的任何想法?建议保持简洁性。

谢谢!

2 个答案:

答案 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;