You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中筛选无NOK分组数据的SQL查询方法求助

PostgreSQL查询方案:排除包含NOK的分组所有行

这有两种简洁的写法能满足你的需求,咱们一个个来看:

方法一:窗口函数标记法

这种方法会给每个分组标记是否存在NOK,再筛选出没有标记的分组数据:

SELECT serverdate, colA, colB, colC, colD
FROM (
    SELECT *,
           -- 检查当前colA分组是否存在NOK,存在则返回1,否则0
           MAX(CASE WHEN colB = 'NOK' THEN 1 ELSE 0 END) OVER (PARTITION BY colA) AS has_nok
    FROM your_table_name -- 记得替换成你的实际表名
) sub_query
WHERE has_nok = 0;

原理很简单:内层查询用窗口函数MAX() OVER (PARTITION BY colA)遍历每个colA分组,只要分组里有一行colB是NOK,整个分组的has_nok就会是1;外层只保留has_nok为0的行,也就是完全没有NOK的分组数据。

方法二:NOT EXISTS子查询法

这种写法逻辑更直白,直接判断当前行所在的分组里有没有NOK:

SELECT t1.*
FROM your_table_name t1 -- 替换成实际表名
WHERE NOT EXISTS (
    -- 检查同colA分组下是否存在NOK的行
    SELECT 1
    FROM your_table_name t2
    WHERE t2.colA = t1.colA
      AND t2.colB = 'NOK'
);

每一行都会做一次检查:如果同一个colA分组里找不到任何colB为NOK的行,就保留这一行,刚好符合你的要求。

两种写法都能得到你要的结果,窗口函数在大数据量场景下如果有合适的索引(比如colA的索引)效率会不错;NOT EXISTS的写法更简洁易懂,看你个人偏好选择就行~

内容的提问来源于stack exchange,提问作者jcf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:05:50