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

MySQL按字段递增列:生成按水果类型计数的临时列

解决水果类型自增序号生成问题

嘿,这个需求用窗口函数就能完美搞定!你要的其实是给每个水果类型按它在原表中出现的顺序生成递增序号,同时保留原表的行顺序对吧?我给你两种可行的方案:

方案一:使用CTE(推荐,代码更清晰)

这种方式用公共表表达式先给原表的每一行标记临时行号,确保能还原原始顺序,再分组生成目标序号:

WITH temp_rows AS (
    SELECT 
        fruit_id,
        fruit_name,
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS original_row
    FROM fruits
)
SELECT 
    fruit_id,
    fruit_name,
    ROW_NUMBER() OVER (PARTITION BY fruit_name ORDER BY original_row) AS increment_value
FROM temp_rows
ORDER BY original_row;

方案二:子查询替代(兼容旧版本数据库)

如果你的数据库不支持CTE(比如MySQL 5.7及更早版本),可以用子查询实现同样的逻辑:

SELECT 
    fruit_id,
    fruit_name,
    ROW_NUMBER() OVER (PARTITION BY fruit_name ORDER BY original_row) AS increment_value
FROM (
    SELECT 
        fruit_id,
        fruit_name,
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS original_row
    FROM fruits
) AS temp_rows
ORDER BY original_row;

关键逻辑解释

  • PARTITION BY fruit_name:按水果名称分组,让每个类型的水果单独计算递增序号
  • ROW_NUMBER() OVER (...):给每个分组内的记录,按照原表的行顺序生成从1开始的唯一序号
  • ORDER BY original_row:确保最终输出的行顺序和原表完全一致

执行后你会得到和期望完全匹配的结果:

fruit_idfruit_nameincrement_value
5Apple1
8Banana1
8Banana2
5Apple2
5Apple3

内容的提问来源于stack exchange,提问作者Alberto Moro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:54:37