SQL Server中按ID去重:含Y则留Y,仅含N则保留
SQL Server 按ID保留指定Check记录的实现方案
需求说明
针对目标表,需按以下规则处理重复ID的记录:
- 若同一ID存在
Check为Y的记录,仅保留其中一条Y记录(其余同ID行删除) - 若ID仅存在
Check为N的记录,则保留该记录 - 需保留表中所有其他列
实现方法
方法1:查询目标结果(不修改原表)
使用窗口函数ROW_NUMBER()给每个ID分组排序,优先保留Check='Y'的记录,再提取每组的第一条数据:
WITH RankedRecords AS ( SELECT *, -- 按ID分组,Y优先级高于N,给Y标记排序值0,N标记1 ROW_NUMBER() OVER ( PARTITION BY ID ORDER BY CASE WHEN [Check] = 'Y' THEN 0 ELSE 1 END ) AS RowNum FROM YourTableName -- 替换为实际表名 ) SELECT * -- 可指定具体列,避免返回RowNum FROM RankedRecords WHERE RowNum = 1;
方法2:直接删除冗余行(修改原表)
如果需要直接清理原表中的冗余数据,可基于同样的排序逻辑删除RowNum>1的行:
WITH RankedRecords AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY ID ORDER BY CASE WHEN [Check] = 'Y' THEN 0 ELSE 1 END ) AS RowNum FROM YourTableName -- 替换为实际表名 ) DELETE FROM RankedRecords WHERE RowNum > 1;
注意事项
Check是SQL Server的关键字,必须用方括号[Check]包裹列名- 若同一ID存在多条
Check='Y'的记录,上述逻辑会保留排序后的第一条;若需保留所有Y记录,可调整窗口函数为RANK()并筛选Rank=1 - 执行删除操作前建议先备份数据,或先用查询语句验证结果是否符合预期
内容的提问来源于stack exchange,提问作者nzskra
相关产品推荐
相关产品推荐

