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 你的排序字段;
效果验证
用你的示例数据测试,以上写法都会得到你预期的结果:
| IDs | Address | Auto Increment |
|---|---|---|
| 3789 | 123 Main | 1 |
| 3789 | 2134 Bird | 1 |
| 89787 | 433 Giraffe | 2 |
| 89787 | 299 Car ST | 2 |
| 65514 | 23409 Tree Dr | 3 |
| 65514 | 123 White Oak | 3 |
| 65514 | 343 Birch | 3 |
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

