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
相关产品推荐
相关产品推荐

