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

在T-SQL/SQL Server中按MEMID分组处理行并设置FLAG

解决方案

方案1:聚合函数实现(性能最优)

如果同一MEMID对应的DOS_FROM是固定值(如示例数据),可以直接用聚合函数快速实现需求:

SELECT 
    MEMID,
    DOS_FROM,
    MAX(FLAG) AS FLAG
FROM your_table
GROUP BY MEMID, DOS_FROM;

原理:字符排序中'Y'的优先级高于'N',MAX(FLAG)会自动返回每组中优先级最高的FLAG值——只要组内存在'Y'就返回'Y',否则返回'N',同时自动实现每个MEMID(+DOS_FROM)仅保留一行。

方案2:窗口函数实现(灵活性更强)

如果需要保留更多字段,或者同一MEMID可能对应不同DOS_FROM且需分别处理,用窗口函数可以更灵活地控制行的选择逻辑:

WITH ranked_records AS (
    SELECT 
        MEMID,
        DOS_FROM,
        FLAG,
        -- 给FLAG='Y'的行分配最高优先级(排名1),其他行排名2
        ROW_NUMBER() OVER (
            PARTITION BY MEMID, DOS_FROM 
            ORDER BY CASE WHEN FLAG = 'Y' THEN 1 ELSE 2 END
        ) AS row_rank
    FROM your_table
)
SELECT MEMID, DOS_FROM, FLAG
FROM ranked_records
WHERE row_rank = 1;

原理:通过PARTITION BY按MEMID和DOS_FROM分组,用ORDER BY给FLAG='Y'的行设置最高优先级,最后筛选出每组的第一行,确保每个分组仅保留符合要求的一行。

注意事项

  • 两种方案都无需使用游标,性能远高于游标遍历,适合大数据量场景;
  • 如果DOS_FROM对同一MEMID是唯一值,GROUP BY时可以只写MEMID,但保留DOS_FROM在分组字段中更严谨,避免数据异常。

内容的提问来源于stack exchange,提问作者Michael Whitehead

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:57:42