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

求助SQL查询语句:筛选所有对应Col3均为'Y'的Col1值

解决方案:筛选Col3全为'Y'的Col1记录

首先先把你提供的原始数据整理出来,方便参考:

Col1;Col2;Col3
12345;01;Y
12345;02;Y
12345;03;Y
22222;01;Y
22222;02;Y
22222;03;N
33333;01;N
44444;01;Y

你的需求是找出所有**对应Col3记录全部为'Y'**的Col1值,也就是排除那些存在至少一条Col3为'N'的Col1。下面提供几种常用的实现方式:

方法1:GROUP BY + HAVING(最简洁直观)

这是处理这类“全满足”需求的经典写法,通过分组后过滤条件实现:

SELECT Col1
FROM your_table_name
GROUP BY Col1
HAVING COUNT(CASE WHEN Col3 != 'Y' THEN 1 END) = 0;

逻辑说明:

  • GROUP BY Col1 将相同Col1的所有记录归为一组
  • COUNT(CASE WHEN Col3 != 'Y' THEN 1 END) 统计每组中Col3不为'Y'的记录数量
  • HAVING 子句只保留统计数为0的分组,也就是该Col1下没有非'Y'的记录

你也可以利用字符排序特性简化写法(因为'Y'的ASCII码比'N'大):

SELECT Col1
FROM your_table_name
GROUP BY Col1
HAVING MIN(Col3) = 'Y' AND MAX(Col3) = 'Y';

如果一组里的Col3全是'Y',那么最小值和最大值都会是'Y',反之只要有一个'N',最小值就会是'N'。

方法2:NOT EXISTS 子查询

这种写法逻辑更直白:找出那些**不存在同Col1且Col3为'N'**的记录:

SELECT DISTINCT Col1
FROM your_table_name t1
WHERE NOT EXISTS (
    SELECT 1
    FROM your_table_name t2
    WHERE t2.Col1 = t1.Col1
      AND t2.Col3 = 'N'
);

逻辑说明:

  • 外层查询遍历每条记录,子查询检查当前Col1是否存在Col3为'N'的记录
  • NOT EXISTS 表示如果子查询找不到匹配的记录,就保留当前Col1
  • DISTINCT 用来去重,因为同一个Col1会有多条记录

方法3:窗口函数(适合复杂场景扩展)

如果后续需要更多关联逻辑,可以用窗口函数先标记每个Col1是否包含'N',再筛选:

WITH cte AS (
    SELECT Col1,
           MAX(CASE WHEN Col3 = 'N' THEN 1 ELSE 0 END) OVER (PARTITION BY Col1) AS has_n
    FROM your_table_name
)
SELECT DISTINCT Col1
FROM cte
WHERE has_n = 0;

逻辑说明:

  • 用CTE(公共表表达式)给每个Col1添加一个has_n标记:如果该Col1存在'N',标记为1,否则为0
  • 最后筛选出has_n为0的Col1值

以上三种方法都能得到你想要的结果:12345和44444。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:40:07