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

如何使用带分区的row_number()无需额外排序实现数值变化时序号重置

实现思路

你需要的是对连续出现的相同Num值做组内编号,属于SQL典型的「数据孤岛」场景,核心逻辑是先给连续相同的Num划分到同一个分组,再对每个分组内的行按Id升序编号即可。


通用窗口函数解法(支持MySQL 8.0+、PostgreSQL、SQL Server、Oracle等主流数据库)

WITH grp_cte AS (
    SELECT 
        Id,
        Num,
        -- 计算分组标记:每当Num和上一行不同时分组标记+1
        SUM(CASE WHEN Num = LAG(Num) OVER(ORDER BY Id) THEN 0 ELSE 1 END) OVER(ORDER BY Id) AS grp_id
    FROM table_1
)
SELECT 
    Id,
    Num,
    -- 每个分组内按Id升序编号,就是目标row_num
    ROW_NUMBER() OVER(PARTITION BY grp_id ORDER BY Id) AS row_num
FROM grp_cte
ORDER BY Id;

MySQL 5.x 无窗口函数兼容解法

如果你的数据库版本不支持窗口函数,可以用自定义变量实现:

SELECT 
    Id,
    Num,
    row_num
FROM (
    SELECT 
        t.Id,
        t.Num,
        @row_num := IF(@prev_num = t.Num, @row_num + 1, 1) AS row_num,
        @prev_num := t.Num
    FROM table_1 t, (SELECT @prev_num := NULL, @row_num := 0) AS init
    ORDER BY t.Id
) AS res;

以上两种方案的执行结果完全匹配你给出的预期输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:06:04