如何按ID分组生成两列数值间的连续数字列表?
解决方案
方法1:递归CTE实现(SQL Server 2005+)
递归CTE可以逐行展开每个ID对应的数值区间,是直观的实现方式:
WITH RecursiveNumbers AS ( -- 锚点:取出每条记录的起始值 SELECT id, beg AS 数值, ending FROM #temp UNION ALL -- 递归:每次数值+1,直到达到结束值 SELECT id, 数值 + 1, ending FROM RecursiveNumbers WHERE 数值 + 1 <= ending ) SELECT id, 数值 FROM RecursiveNumbers ORDER BY id, 数值 OPTION (MAXRECURSION 0); -- 解除默认递归深度限制,适用于大区间场景
方法2:数字表关联(性能更优)
如果处理的区间范围较大,递归CTE性能可能不足,可通过预先生成的数字表关联筛选:
利用系统内置数字表
SQL Server的master..spt_values表包含0-2047的连续整数,适合区间较小的场景:
SELECT t.id, v.number AS 数值 FROM #temp t JOIN master..spt_values v ON v.number BETWEEN t.beg AND t.ending WHERE v.type = 'P' -- 筛选正整数类型的记录 ORDER BY t.id, v.number;
自定义大数字表
若区间超过2047,可自行生成足够大的数字序列:
WITH Numbers AS ( SELECT 1 AS number UNION ALL SELECT number + 1 FROM Numbers WHERE number + 1 <= 10000 -- 按需调整最大数值 ) SELECT t.id, n.number AS 数值 FROM #temp t JOIN Numbers n ON n.number BETWEEN t.beg AND t.ending ORDER BY t.id, n.number OPTION (MAXRECURSION 0);
两种方法都能输出你期望的结果集,可根据数据量和区间大小选择合适的实现方式。
内容的提问来源于stack exchange,提问作者user1083828
相关产品推荐
相关产品推荐

