如何合并重复记录?求SQL提取Code列相似字符交集的方法
解决Routes表分组后Code字段的统一提取问题
看起来你已经搞定了分组去重的核心逻辑,现在的关键是把格式混乱的Code字段统一成每组的"核心标识"——比如R14系列取R14、RT15系列取RT15。根据你的示例数据,核心规律是每组的Code都包含对应的Route数字,我们只需要提取从开头到Route数字结束的部分,下面分数据库给出具体实现:
核心思路
- 先按你已经确定的字段(
Route, State, City, Start, End, Style)分组,确保每组是唯一的记录; - 从每组的任意一个Code(比如取最小的Code)中,提取出包含Route数字的核心前缀部分;
- 将提取后的核心前缀作为分组后的Code值。
SQL实现(分数据库)
1. SQL Server
SELECT -- 提取Code中从开头到Route数字结束的部分 LEFT(g.TempCode, CHARINDEX(CAST(g.Route AS VARCHAR(10)), g.TempCode) + LEN(CAST(g.Route AS VARCHAR(10))) - 1) AS Code, g.Route, g.State, g.City, g.Start, g.[End], -- End是关键字,需用方括号包裹 g.Style FROM ( -- 按目标字段分组,同时取每组的最小Code作为提取样本 SELECT Route, State, City, Start, [End], Style, MIN(Code) AS TempCode FROM Routes GROUP BY Route, State, City, Start, [End], Style ) AS g;
2. MySQL
SELECT LEFT(g.TempCode, LOCATE(CONVERT(g.Route, CHAR), g.TempCode) + LENGTH(CONVERT(g.Route, CHAR)) - 1) AS Code, g.Route, g.State, g.City, g.Start, g.`End`, -- End是关键字,需用反引号包裹 g.Style FROM ( SELECT Route, State, City, Start, `End`, Style, MIN(Code) AS TempCode FROM Routes GROUP BY Route, State, City, Start, `End`, Style ) AS g;
效果验证
针对你的示例数据,这个逻辑会生成完全符合预期的结果:
- R14系列(Route=14,High风格):从
R14/R14-01中提取出R14; - R15系列(Route=15,Low风格):从
R15-1/R15B中提取出R15; - RT15系列(Route=15,High风格):从
RT15°/RT15/H中提取出RT15。
这个方法的优势是不需要依赖固定的前缀长度,只要每组的Code包含对应的Route数字,就能自动匹配出正确的核心标识,兼容性很强。
内容的提问来源于stack exchange,提问作者prueba prueba
相关产品推荐
相关产品推荐

