如何生成重复记录并重新索引列值?附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;
逻辑说明:
- 锚点成员先获取原始表的所有数据,同时标记
current_count为1(表示当前是第1次重复); - 递归成员会持续生成新行,每次把
current_count加1,直到它等于count列的数值; - 最后用
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到N的连续数字表(N要大于你表中最大的
count值); - 将原始表和数字表关联,只保留数字小于等于
count的行,这样就自动实现了按count值重复行; - 同样用
ROW_NUMBER()生成连续的新id。
这两种方法都能得到你想要的结果:每一行根据count值重复对应次数,并且新的id是从1开始的连续整数。
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

