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

SQL查询需求:筛选仅存在YES状态的唯一num值

筛选仅含status='YES'的唯一num记录

嘿,我来帮你搞定这个数据筛选的需求!我们要找出所有num值从未关联过status='NO'的记录——换句话说,这些num对应的所有状态都只能是YES。下面给你几种常用的SQL实现方案,适配不同的数据库场景:

方法1:子查询排除法

先找出所有出现过status='NO'的num,然后在主查询里直接排除这些值,同时只保留status='YES'的记录:

SELECT id, num, status
FROM your_table
WHERE num NOT IN (
    SELECT DISTINCT num
    FROM your_table
    WHERE status = 'NO'
)
AND status = 'YES';

这种写法简单直观,新手也容易理解。

方法2:GROUP BY + HAVING分组校验

通过分组统计每个num的状态情况,确保该num下完全没有NO状态:

SELECT t.id, t.num, t.status
FROM your_table t
JOIN (
    SELECT num
    FROM your_table
    GROUP BY num
    HAVING COUNT(CASE WHEN status = 'NO' THEN 1 END) = 0
) filtered_num ON t.num = filtered_num.num
WHERE t.status = 'YES';

如果你的数据库里status只有YES和NO两种值,还可以用更简洁的写法:

SELECT t.id, t.num, t.status
FROM your_table t
JOIN (
    SELECT num
    FROM your_table
    GROUP BY num
    HAVING MAX(status) = 'YES' AND MIN(status) = 'YES'
) filtered_num ON t.num = filtered_num.num;

这里利用了字符串排序特性,'YES'的字符顺序比'NO'靠后,所以如果某个num的最大和最小状态都是YES,就说明它没有NO的记录。

方法3:窗口函数法(适用于MySQL 8+、PostgreSQL、SQL Server等)

用窗口函数给每个num计算对应的NO状态数量,再筛选数量为0的记录:

WITH num_status_counts AS (
    SELECT 
        id, num, status,
        SUM(CASE WHEN status = 'NO' THEN 1 ELSE 0 END) OVER (PARTITION BY num) AS no_count
    FROM your_table
)
SELECT id, num, status
FROM num_status_counts
WHERE no_count = 0 AND status = 'YES';

这种方法在处理复杂的关联筛选时灵活性更高。

测试结果验证

用你提供的测试数据表,以上任意一种方法都会返回你想要的结果:

+--------+-----+--------+
| id     | num | status |
+--------+-----+--------+
| 364522 | BBB | YES    |
| 364527 | CCC | YES    |
| 364532 | EEE | YES    |
+--------+-----+--------+

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:42:10