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

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;

逻辑说明:

  1. 子查询里用COUNT() OVER(PARTITION BY [group])给每条记录打上标记,告诉我们它所在的分组有没有目标item;
  2. 外层根据标记筛选:如果分组有目标记录,就只保留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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:27:32