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

SQL分组查询需求:筛选不含FLAG=0且包含FLAG=1的记录

解决分组筛选NAME的问题

首先,咱们先看看你原来的查询为什么没得到预期结果:select * from mytable where FLAG NOT IN (0) GROUP BY NAME; 这个语句只是把表中FLAG=0的行过滤掉了,但并没有排除那些本身存在FLAG=0记录的NAME。比如abc这个NAME,虽然它有FLAG=1和2的行,但它同时也有FLAG=0的行,按照需求应该被排除,但你的原查询会保留abc的1和2行并分组,这就不符合要求了。

要实现你的需求——找出没有FLAG=0但包含FLAG=1的NAME,我们可以用两种常用的方法:

方法一:GROUP BY + HAVING子句(推荐)

这种方法直接通过分组后统计每个NAME的FLAG情况,精准筛选符合条件的记录:

SELECT NAME, 1 AS FLAG
FROM mytable
GROUP BY NAME
HAVING 
  -- 统计该NAME下FLAG=0的记录数,等于0表示没有0
  COUNT(CASE WHEN FLAG = 0 THEN 1 END) = 0
  -- 统计该NAME下FLAG=1的记录数,大于0表示至少有一条1
  AND COUNT(CASE WHEN FLAG = 1 THEN 1 END) > 0;

这里我们直接把FLAG设为1,因为已经确认该NAME存在FLAG=1的记录,这样就能得到你想要的结果格式。

如果你想更直观地看到统计逻辑,也可以用SUM代替COUNT:

SELECT NAME, 1 AS FLAG
FROM mytable
GROUP BY NAME
HAVING 
  SUM(CASE WHEN FLAG = 0 THEN 1 ELSE 0 END) = 0
  AND SUM(CASE WHEN FLAG = 1 THEN 1 ELSE 0 END) > 0;

方法二:子查询排除法

先找出所有存在FLAG=0的NAME,然后排除这些NAME,再筛选出FLAG=1的记录并去重:

SELECT DISTINCT NAME, 1 AS FLAG
FROM mytable
WHERE 
  NAME NOT IN (SELECT NAME FROM mytable WHERE FLAG = 0)
  AND FLAG = 1;

DISTINCT用来避免同一个NAME因为有多个FLAG=1的行而重复显示。

这两种方法都能得到你期望的结果:

NAME FLAG
------------------
def 1
efg 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:46:45