如何用SQL查询其他分组均存在但当前分组缺失的非重复数值
需求说明
查询满足如下规则的条目:某数值在非目标的所有其他分组中均存在,但在目标分组中不存在。
示例场景:现有数据表包含column1、column2两列,column1取值为a、b、c三类分组:
- a对应的
column2取值为1、2、3、4 - b对应的
column2取值为1、2、3、4 - c对应的
column2取值仅有1、2、3
期望输出结果为column1=c、column2=4,也就是目标分组c缺失的、其他所有分组都共有的column2值。
实现思路
- 先统计出所有非目标分组里都存在的
column2值集合 - 匹配过滤出目标分组中不存在的上述集合数值,即为需要的结果
可直接复用的SQL代码
以下写法兼容MySQL、PostgreSQL、SQL Server等绝大多数主流SQL引擎:
-- 替换test_table为你的实际表名,替换'c'为你要查询的目标分组值 SELECT DISTINCT 'c' AS column1, t2.column2 FROM test_table t1 -- 关联其他分组的共有column2值 CROSS JOIN ( SELECT column2 FROM test_table WHERE column1 != 'c' GROUP BY column2 -- 示例中其他分组为a、b共2个,要求column2在所有其他分组都出现 HAVING COUNT(DISTINCT column1) = 2 ) t2 -- 过滤掉目标分组已存在的column2值 WHERE NOT EXISTS ( SELECT 1 FROM test_table t3 WHERE t3.column1 = 'c' AND t3.column2 = t2.column2 )
如果需要动态计算其他分组数量,无需手动填写数字,可以使用以下通用写法:
SELECT DISTINCT target_group AS column1, t2.column2 FROM ( -- 这里设置你要查询的目标分组 SELECT 'c' AS target_group, -- 自动计算其他分组的总数量 COUNT(DISTINCT column1) AS other_group_count FROM test_table WHERE column1 != 'c' ) config CROSS JOIN ( SELECT column2 FROM test_table WHERE column1 != (SELECT target_group FROM config) GROUP BY column2 HAVING COUNT(DISTINCT column1) = (SELECT other_group_count FROM config) ) t2 WHERE NOT EXISTS ( SELECT 1 FROM test_table t3 WHERE t3.column1 = (SELECT target_group FROM config) AND t3.column2 = t2.column2 )
结果验证
代入你给出的示例数据执行上述SQL,返回结果如下,完全符合预期:
| column1 | column2 |
|---|---|
| c | 4 |
内容的提问来源于stack exchange,提问作者MANOHAR N
相关产品推荐
相关产品推荐

