如何编写SQL根据SOURCE_VAL的出现次序生成SEQUENCE_VAL序号列
SQL实现同值分组内顺序编号方案
核心实现逻辑
用标准SQL窗口函数ROW_NUMBER()即可完成需求,该语法兼容MySQL 8.0+、PostgreSQL、SQL Server、Oracle等所有主流现代数据库。
直接查询生成编号
如果不需要修改表结构,仅查询时输出序号:
SELECT SOURCE_VAL, ROW_NUMBER() OVER ( PARTITION BY SOURCE_VAL ORDER BY (SELECT 1) ) AS SEQUENCE_VAL FROM 你的表名;
PARTITION BY SOURCE_VAL:按照SOURCE_VAL的值分组,相同值进入同一个分组单独计数ORDER BY后建议替换为表中能确定数据顺序的字段(比如自增ID、创建时间),例如ORDER BY id ASC,确保序号顺序和你预期的一致。如果没有指定排序字段,ORDER BY (SELECT 1)会按数据库默认存储顺序排序,匹配你给出的示例效果。
新增列并写入序号
如果需要在原表新增字段持久化存储序号:
- 先新增SEQUENCE_VAL字段
ALTER TABLE 你的表名 ADD COLUMN SEQUENCE_VAL INT;
- 写入序号值(以带主键的表为例)
WITH numbered_result AS ( SELECT 表主键字段名, ROW_NUMBER() OVER (PARTITION BY SOURCE_VAL ORDER BY (SELECT 1)) AS seq FROM 你的表名 ) UPDATE 你的表名 t INNER JOIN numbered_result nr ON t.表主键字段名 = nr.表主键字段名 SET t.SEQUENCE_VAL = nr.seq;
老版本MySQL兼容方案
如果你使用的是不支持窗口函数的MySQL 5.x及以下版本,可以用变量实现:
SET @prev_val = '', @seq = 1; UPDATE 你的表名 SET SEQUENCE_VAL = IF( SOURCE_VAL = @prev_val, @seq := @seq + 1, @seq := 1 AND @prev_val := SOURCE_VAL ) ORDER BY SOURCE_VAL;
内容的提问来源于stack exchange,提问作者Declan
相关产品推荐
相关产品推荐

