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

MySQL如何按组分配递增编号——我的写法为何无效?

解决MySQL中按分组分配全局递增编号的问题

你当前使用的row_number() over (partition by IDs)是为每个分组内的行分配行号,所以同一IDs下的行会得到1、2、3...这样的递增数,不符合你要的"同组共享一个编号、不同组依次递增"的需求。

正确解决方案

根据你的MySQL版本,选择对应的写法:

1. MySQL 8.0及以上版本(支持窗口函数)

如果你需要按IDs的数值大小分配编号:

SELECT 
    IDs,
    Address,
    dense_rank() OVER (ORDER BY IDs) AS `Auto Increment`
FROM X;

如果你需要按IDs在表中首次出现的顺序分配编号(比如示例中的3789→1、89787→2、65514→3),可以借助分组内的最小行号或主键来排序:

SELECT 
    IDs,
    Address,
    dense_rank() OVER (ORDER BY MIN(ROW_NUMBER() OVER ()) OVER (PARTITION BY IDs)) AS `Auto Increment`
FROM X;

注:如果表有自增主键(比如id列),可以替换成MIN(id) OVER (PARTITION BY IDs),写法更简洁。

2. MySQL 5.7及以下版本(使用用户变量)

SELECT 
    IDs,
    Address,
    @rank := IF(@prev_id = IDs, @rank, @rank + 1) AS `Auto Increment`,
    @prev_id := IDs
FROM X, (SELECT @rank := 0, @prev_id := NULL) vars
-- 按需求排序:如果要按首次出现顺序,这里填主键字段;按数值排序则填IDs
ORDER BY 你的排序字段;

效果验证

用你的示例数据测试,以上写法都会得到你预期的结果:

IDsAddressAuto Increment
3789123 Main1
37892134 Bird1
89787433 Giraffe2
89787299 Car ST2
6551423409 Tree Dr3
65514123 White Oak3
65514343 Birch3

内容的提问来源于stack exchange,提问作者John Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:06:18