如何在SQL Server中为同InstanceId的重复Name值追加计数并更新
SQL Server 更新重复名称并追加备份编号的实现
需求说明
按InstanceId分组,每组内保留第一个Name值不变,后续重复的Name值追加_Backup_1、_Backup_2这类计数编号,最终更新表数据。
原始表数据
| Id | InstanceId | Name |
|---|---|---|
| 1 | 1 | DiscoveryInstance |
| 2 | 1 | DiscoveryInstance |
| 3 | 2 | ETLInstance |
| 4 | 3 | DiscoveryInstance |
| 5 | 3 | DiscoveryInstance |
| 6 | 2 | ETLInstance |
| 7 | 2 | ETLInstance |
期望更新后的数据
| Id | InstanceId | Name |
|---|---|---|
| 1 | 1 | DiscoveryInstance |
| 2 | 1 | DiscoveryInstance_Backup_1 |
| 3 | 2 | ETLInstance |
| 4 | 3 | DiscoveryInstance |
| 5 | 3 | DiscoveryInstance_Backup_1 |
| 6 | 2 | ETLInstance_Backup_1 |
| 7 | 2 | ETLInstance_Backup_2 |
实现语句
使用CTE结合窗口函数ROW_NUMBER()标记每组内的行顺序,再执行更新:
WITH RankedInstances AS ( SELECT Id, Name, -- 按InstanceId和Name分组,按Id升序生成行号 ROW_NUMBER() OVER (PARTITION BY InstanceId, Name ORDER BY Id) AS RowNum FROM YourTableName -- 请替换为实际表名 ) UPDATE RankedInstances SET Name = CONCAT(Name, '_Backup_', RowNum - 1) WHERE RowNum > 1; -- 仅更新非首行的重复名称
语句说明
PARTITION BY InstanceId, Name:将数据按实例ID和名称分组,确保同一实例下相同名称的行被归为一组。ORDER BY Id:按ID升序排序,保证每组内的第一行是ID最小的记录(即保留原始名称的行)。RowNum > 1:筛选出每组中除首行外的重复记录,通过CONCAT拼接备份编号,实现名称的更新。
内容的提问来源于stack exchange,提问作者Shishank Jha
相关产品推荐
相关产品推荐

