SQL Server中分组内按条件选择单条或全部记录的实现方案
解决SQL Server中分组筛选特定记录的需求
我来帮你搞定这个分组筛选的需求!不用删除任何表记录,咱们用纯查询就能实现你要的效果——每个分组里如果存在item=9999999的记录,就只留这条;没有的话就保留整个分组的所有记录。
下面给你两种实用的实现方式:
方法一:用窗口函数统计分组内目标记录
这种方法通过窗口函数快速判断每个分组是否包含目标记录,逻辑清晰易维护:
SELECT id, [group], item FROM ( SELECT id, [group], item, -- 按group分组,统计当前组内item=9999999的记录数量 COUNT(CASE WHEN item = '9999999' THEN 1 END) OVER(PARTITION BY [group]) AS has_target_record FROM 表A ) AS sub_query -- 筛选逻辑:有目标记录的组只留目标行,无目标记录的组留全组 WHERE (has_target_record > 0 AND item = '9999999') OR has_target_record = 0;
逻辑说明:
- 子查询里用
COUNT() OVER(PARTITION BY [group])给每条记录打上标记,告诉我们它所在的分组有没有目标item; - 外层根据标记筛选:如果分组有目标记录,就只保留
item=9999999的那条;如果没有,就保留该组所有记录。
方法二:用EXISTS子查询直接判断
这种方法逻辑更直观,直接针对每条记录判断是否符合保留条件:
SELECT id, [group], item FROM 表A a WHERE -- 要么当前记录就是目标item item = '9999999' -- 要么当前记录所在分组根本没有目标item OR NOT EXISTS ( SELECT 1 FROM 表A WHERE [group] = a.[group] AND item = '9999999' );
逻辑说明:
每条记录只要满足以下两个条件之一就会被保留:
- 它本身就是
item=9999999的记录; - 它所在的分组里完全没有
item=9999999的记录。
验证结果
两种方法运行后都会得到你期望的结果:
id group item
3 A 9999999
4 B 1234567
5 B 6846677
内容的提问来源于stack exchange,提问作者Rajput
相关产品推荐
相关产品推荐

