如何为数据库表name列重复值追加出现次数后缀生成目标数据
实现方法
核心逻辑是用分组序号函数给相同姓名的行生成连续自增编号,再和原姓名字段拼接即可,主流支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)都可以用以下通用写法:
-- 把代码中的「你的表名」替换为实际数据表的名称即可 SELECT CONCAT(name, '-', ROW_NUMBER() OVER(PARTITION BY name ORDER BY name)) AS name FROM 你的表名;
参数说明:
PARTITION BY name:将所有姓名相同的行划到同一个分组内ROW_NUMBER() OVER(...):给每个分组内的行生成从1开始的连续编号CONCAT:字符串拼接函数,将原姓名、分隔符、序号拼接为最终结果
如果你使用的是不支持窗口函数的旧版本MySQL,可以用变量实现相同效果:
SELECT CONCAT(t.name, '-', t.rank) AS name FROM ( SELECT name, @rank := IF(@current_name = name, @rank + 1, 1) AS rank, @current_name := name FROM 你的表名 ORDER BY name ) t;
如果需要自定义同姓名内的序号排序规则,只需要修改ORDER BY后的字段即可,比如要按数据行的id从小到大生成序号,就把窗口函数内的语句改成ROW_NUMBER() OVER(PARTITION BY name ORDER BY id ASC)。
内容的提问来源于stack exchange,提问作者tiwtiwtiwtiwaaaaa
相关产品推荐
相关产品推荐

