You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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)会按数据库默认存储顺序排序,匹配你给出的示例效果。

新增列并写入序号

如果需要在原表新增字段持久化存储序号:

  1. 先新增SEQUENCE_VAL字段
ALTER TABLE 你的表名 ADD COLUMN SEQUENCE_VAL INT;
  1. 写入序号值(以带主键的表为例)
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:51:00