如何在SQL中基于多字符串列生成唯一row_number,现有写法取值重复
基于多字符串列生成唯一ROW_NUMBER的解决方案
原有写法的问题
- 核心错误:添加了
PARTITION BY子句,该子句的作用是将数据按指定规则分组,每个分组内的ROW_NUMBER都会从1开始重新计数,天然就会出现不同分组序号重复的情况,无法生成全局唯一值 - 潜在错误:直接拼接三个字符串作为分区/排序依据,会出现误判情况,比如
Marker1='ab', Marker2='c'和Marker1='a', Marker2='bc'拼接结果完全相同,会被错误分到同一个分区 - 排序逻辑无效:同一个分区内所有行的分区键完全相同,用相同的值作为排序依据,数据库无法确定行的先后顺序,返回的序号是随机不稳定的
解决方案
场景1:需要全局唯一的序号(所有行的ROWNUMBER值不重复)
直接去掉PARTITION BY子句,排序时直接指定三个字段依次排序即可:
ROW_NUMBER() OVER( ORDER BY [Marker1], [Marker2], [Marker3] DESC ) ROWNUMBER
场景2:需要同三列组合内的唯一序号(相同三列值的行按序编号,不同组合可重复)
修改分区规则和排序规则,避免拼接错误:
ROW_NUMBER() OVER( PARTITION BY [Marker1], [Marker2], [Marker3] ORDER BY [Marker1], [Marker2], [Marker3] DESC ) ROWNUMBER
如果需要同一组合内的序号也是全局唯一的,可以在排序条件中额外加入表内的其他唯一标识字段。
内容的提问来源于stack exchange,提问作者teh_sql
相关产品推荐
相关产品推荐

