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

如何生成重复记录并重新索引列值?附SQL表示例

解决方案:生成重复记录并重新索引

你需要根据表中count列的数值重复对应行的记录,同时生成连续的新id列对吧?针对SQL Server的场景,我给你两种实用的实现方法:

方法一:递归CTE(直观易理解)

递归CTE是处理这类重复行需求的常用方式,逻辑清晰,适合中小数据量的场景:

WITH RecursiveCTE AS (
    -- 锚点:取出所有原始行,初始化当前重复次数为1
    SELECT 
        id AS original_id,
        name,
        count,
        quantity,
        1 AS current_count
    FROM @t
    UNION ALL
    -- 递归:不断复制行,直到当前次数等于目标count值
    SELECT 
        original_id,
        name,
        count,
        quantity,
        current_count + 1
    FROM RecursiveCTE
    WHERE current_count < count
)
-- 生成最终结果,重新分配连续id
SELECT 
    ROW_NUMBER() OVER (ORDER BY original_id, current_count) AS id,
    name,
    quantity
FROM RecursiveCTE
ORDER BY id;

逻辑说明:

  1. 锚点成员先获取原始表的所有数据,同时标记current_count为1(表示当前是第1次重复);
  2. 递归成员会持续生成新行,每次把current_count加1,直到它等于count列的数值;
  3. 最后用ROW_NUMBER()函数按原始id和重复次数排序,生成连续的新id。

方法二:数字表关联(适合大数据量)

如果你的count列数值很大,递归CTE可能会有性能瓶颈,这时候可以用预生成的数字表来关联实现:

-- 生成包含连续数字的临时表(这里生成到1000,可根据实际需求调整上限)
WITH Numbers AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM Numbers WHERE n < 1000
)
SELECT 
    ROW_NUMBER() OVER (ORDER BY t.id, n) AS id,
    t.name,
    t.quantity
FROM @t t
INNER JOIN Numbers n ON n.n <= t.count
ORDER BY id;

逻辑说明:

  1. 先生成一个包含1到N的连续数字表(N要大于你表中最大的count值);
  2. 将原始表和数字表关联,只保留数字小于等于count的行,这样就自动实现了按count值重复行;
  3. 同样用ROW_NUMBER()生成连续的新id。

这两种方法都能得到你想要的结果:每一行根据count值重复对应次数,并且新的id是从1开始的连续整数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:07:37