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

SQL按日期分组生成以1.5为起始的递增计数列问题求解

问题分析

你的原有代码存在两个核心问题:

  • 递归逻辑设计错误:当前递归会为每条prod_id单独生成1.5到分组总条数的完整序列,最终每条原数据会重复N次(N为分组行数),所以出现同cnt值批量重复的问题
  • 仅硬编码筛选了单日期数据,无法实现多日期自动分组递增的需求
最优解决方案

目前主流数据库(MySQL8.0+、PostgreSQL、SQL Server等)都支持窗口函数,用ROW_NUMBER()即可简洁实现需求,无需复杂递归:

SELECT 
    id,
    prod_id,
    code,
    `date`,
    -- 按日期分组,组内按id升序排序生成行号,加0.5刚好符合1.5起始、每次+1的要求
    (ROW_NUMBER() OVER (PARTITION BY `date` ORDER BY id) + 0.5) AS cnt
FROM product;

执行结果和你给出的预期输出完全一致。

若必须使用递归CTE实现的修正方案

如果场景限制必须用递归写法,修正后的逻辑如下:

WITH RECURSIVE ranked AS (
    -- 第一步:先给所有行按日期分组加唯一行号
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY `date` ORDER BY id) AS row_num,
        COUNT(*) OVER (PARTITION BY `date`) AS group_total
    FROM product
),
q AS (
    -- 递归锚点:取每个分组的第一行,cnt设为1.5
    SELECT id, prod_id, code, `date`, row_num, group_total, 1.5 AS cnt 
    FROM ranked 
    WHERE row_num = 1
    UNION ALL
    -- 递归迭代:同一分组内行号+1,cnt也+1
    SELECT r.id, r.prod_id, r.code, r.`date`, r.row_num, r.group_total, q.cnt + 1 AS cnt
    FROM ranked r
    JOIN q ON r.`date` = q.`date` AND r.row_num = q.row_num + 1
    WHERE q.row_num < q.group_total
)
SELECT id, prod_id, code, `date`, cnt 
FROM q
ORDER BY id;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:09:03