T-SQL查询分组后对应列全为负值的去重列值实现方法
问题场景
现有含col1、col2两个字段的数据库表,示例数据如下:
- col1取值序列:1、1、2、3、3
- 对应col2取值序列:2、1、-2、1、-1
需要编写T-SQL语句,查询返回同col1分组下所有col2取值均为负数的去重col1值,以上述示例数据为例,预期返回结果仅为col1=2。
实现方法
核心判断逻辑:只要某个col1分组里存在任意一条col2≥0的记录,这个分组就不符合要求;反过来,组里所有col2都小于0的分组就是目标结果。给两种常用写法,按需选择即可:
写法1:聚合分组判断(写法最简洁)
按col1分组后,直接判断组内col2的最大值是否小于0——如果全是负数,组内最大值必然也是负数,只要有一个非负数值,最大值就会≥0,逻辑非常直观:
-- 把YourTable替换成你的实际表名即可 SELECT col1 FROM YourTable GROUP BY col1 HAVING MAX(col2) < 0;
拿示例数据验证逻辑:
- col1=1分组的col2值为2、1,最大值2≥0,排除
- col1=2分组的col2值为-2,最大值-2<0,符合要求
- col1=3分组的col2值为1、-1,最大值1≥0,排除
最终返回结果就是2,完全匹配预期。
写法2:NOT EXISTS判断(大表性能更优)
如果表数据量较大,且col1字段建有索引,用NOT EXISTS的写法往往性能更好,逻辑是筛选出「不存在同col1下col2≥0记录」的col1值:
SELECT DISTINCT t1.col1 FROM YourTable t1 WHERE NOT EXISTS ( SELECT 1 FROM YourTable t2 WHERE t2.col1 = t1.col1 AND t2.col2 >= 0 );
两种写法返回结果完全一致,根据实际表的数据量、索引情况选择即可。
内容的提问来源于stack exchange,提问作者mytabi
相关产品推荐
相关产品推荐

