如何筛选所有FLAG均为1的ACCOUNT记录?求SQL查询语句
解决方案:筛选所有FLAG均为1的ACCOUNT记录
方法1:使用NOT EXISTS子查询
通过排除存在非1 FLAG的ACCOUNT,直接筛选符合条件的记录:
SELECT t1.* FROM your_table t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.ACCOUNT = t1.ACCOUNT AND t2.FLAG != 1 );
逻辑:对每条记录检查同账号下是否存在FLAG不等于1的条目,无则保留该记录。
方法2:GROUP BY + HAVING 结合 JOIN
先通过分组筛选出所有FLAG都是1的ACCOUNT,再关联原表获取完整记录:
SELECT t.* FROM your_table t JOIN ( SELECT ACCOUNT FROM your_table GROUP BY ACCOUNT HAVING MAX(FLAG) = 1 AND MIN(FLAG) = 1 ) valid_accounts ON t.ACCOUNT = valid_accounts.ACCOUNT;
逻辑:分组后,只有当账号下所有FLAG的最大值和最小值均为1时,说明该账号FLAG全为1,再关联原表取出这些账号的所有记录。
方法3:窗口函数(适用于支持窗口函数的数据库)
利用窗口函数计算每个账号的FLAG极值,再筛选符合条件的记录:
SELECT ACCOUNT, FLAG FROM ( SELECT *, MAX(FLAG) OVER (PARTITION BY ACCOUNT) AS max_flag, MIN(FLAG) OVER (PARTITION BY ACCOUNT) AS min_flag FROM your_table ) sub_query WHERE max_flag = 1 AND min_flag = 1;
逻辑:给每条记录标记其所属账号的最大和最小FLAG,两者均为1时,说明该账号所有FLAG都是1,保留这些记录。
注意:请将上述SQL中的
your_table替换为你的实际表名。
内容的提问来源于stack exchange,提问作者team 9
相关产品推荐
相关产品推荐

