在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
相关产品推荐
相关产品推荐

