如何利用变量区分重复行并为重复行名称添加序号标识
给重复行的名称添加序号解决方案
原始数据:
name identity gender Mary student female Mary student female Mary student female Jack teacher male Jack teacher male Jack teacher male
目标效果:
name identity gender Mary1 student female Mary2 student female Mary3 student female Jack1 teacher male Jack2 teacher male Jack3 teacher male
直接用窗口函数ROW_NUMBER()就能实现,不需要自定义函数,具体SQL语句如下:
SELECT CONCAT(name, ROW_NUMBER() OVER (PARTITION BY name, identity, gender ORDER BY (SELECT NULL))) AS name, identity, gender FROM your_table_name;
语句说明:
PARTITION BY name, identity, gender:将name、identity、gender完全相同的行划分为一组,确保只给真正重复的行编号ROW_NUMBER() OVER (...):给每组内的行依次分配1、2、3...的序号CONCAT(name, ...):把原名称和序号拼接在一起,得到带编号的新名称ORDER BY (SELECT NULL):如果不需要特定排序顺序,用这个可以让数据库按默认顺序编号;也可以替换成你需要的排序字段(比如表的主键)
不同数据库的字符串拼接语法略有差异:
- SQL Server:可以用
name + CAST(ROW_NUMBER() OVER (...) AS VARCHAR)替代CONCAT - Oracle:用
name || ROW_NUMBER() OVER (...) - MySQL:直接使用上述通用写法即可
你之前尝试的tvValues函数并不适合这个场景,窗口函数是处理这类分组编号问题的最优方案。
内容的提问来源于stack exchange,提问作者Yaodong Liu
相关产品推荐
相关产品推荐

