如何在SQL Server中为重复公司名称前生成序号
解决SQL Server中重复公司名称生成唯一值的问题
嘿,我懂你的痛点——要把重复的公司名称改成唯一值,适配那个只接受唯一名称的平台对吧?你用ROW_NUMBER()结合PARTITION BY的思路完全没问题,只是在序号拼接的细节上可以调整一下,让结果更符合需求。
核心思路
我们先给每个重复的公司名称按分组分配序号,然后只在非第一个出现的名称后面加上序号(比如ABC Corp (1)、ABC Corp (2)),第一个保持原名不变,这样既保证唯一性,又不会破坏原始名称的可读性。
示例数据集
假设你的源表叫CompanyImportData,结构和数据大概是这样:
| CompanyName | Address | City | Contact |
|---|---|---|---|
| ABC Corp | 123 Main St | NY | John Doe |
| ABC Corp | 456 Oak Ave | LA | Jane Smith |
| XYZ Inc | 789 Pine Rd | CHI | Bob Brown |
| ABC Corp | 321 Elm Ln | HOU | Alice Lee |
实现代码
SELECT -- 仅对重复项(序号>1)拼接序号 CASE WHEN RowNum > 1 THEN CONCAT(CompanyName, ' (', RowNum - 1, ')') ELSE CompanyName END AS UniqueCompanyName, Address, City, Contact FROM ( -- 内部查询:按公司名称分组,给每条记录分配序号 SELECT CompanyName, Address, City, Contact, -- 这里的ORDER BY可以换成你需要的排序字段(比如Address/Contact) ROW_NUMBER() OVER (PARTITION BY CompanyName ORDER BY (SELECT NULL)) AS RowNum FROM CompanyImportData ) AS NumberedCompanies -- 最终按公司名称和序号排序,保持逻辑顺序 ORDER BY CompanyName, RowNum;
代码解释
- 内部子查询:用
ROW_NUMBER() OVER (PARTITION BY CompanyName ...)给每个相同公司名称的记录分配一个递增的序号,PARTITION BY负责按公司名称分组,ORDER BY控制序号的生成顺序(如果需要按地址、联系人排序,把(SELECT NULL)换成对应的字段即可)。 - 外部查询:通过
CASE判断,如果是分组内的第一条记录(RowNum=1),直接保留原公司名称;否则在名称后拼接(RowNum-1),让序号从1开始(避免出现ABC Corp (2)这种奇怪的命名)。
执行结果
运行上述代码后,你会得到符合要求的唯一名称数据集:
| UniqueCompanyName | Address | City | Contact |
|---|---|---|---|
| ABC Corp | 123 Main St | NY | John Doe |
| ABC Corp (1) | 456 Oak Ave | LA | Jane Smith |
| ABC Corp (2) | 321 Elm Ln | HOU | Alice Lee |
| XYZ Inc | 789 Pine Rd | CHI | Bob Brown |
这样处理后,所有公司名称都是唯一的,完美适配目标平台的要求啦!
内容的提问来源于stack exchange,提问作者Pedram Salamati
相关产品推荐
相关产品推荐

