SQL Server中基于列聚合计算从单条记录生成多条记录的实现
SQL Server单条记录按间隔拆分多行实现方案
用递归公用表表达式(CTE)即可实现按指定条数、指定日期间隔拆分单条源数据为多条记录,无需额外创建辅助表,兼容SQL Server 2008及以上所有版本。
可直接运行的示例代码
-- 第一步:模拟源表数据,实际使用时替换为自身业务表即可 WITH source_data AS ( SELECT 'a' AS client, CAST('2021-10-01' AS DATE) AS reminder_date, 28 AS [day], 4 AS generate_reminder ), -- 第二步:递归生成提醒记录 reminder_cte AS ( -- 递归起点:第一条提醒(原始日期) SELECT client, reminder_date, [day], generate_reminder, 1 AS serial_num FROM source_data UNION ALL -- 递归迭代:每次加指定天数,直到达到要求的生成条数 SELECT client, DATEADD(DAY, [day], reminder_date), [day], generate_reminder, serial_num + 1 FROM reminder_cte WHERE serial_num < generate_reminder ) -- 第三步:输出最终结果 SELECT client, reminder_date FROM reminder_cte ORDER BY reminder_date;
注意事项
如果业务场景中
generate_reminder字段值大于100,SQL Server默认递归深度限制会触发报错,需要在查询语句末尾添加OPTION (MAXRECURSION 0)取消递归深度限制,0代表无限制,也可替换为业务需要的最大数值。
高性能替代方案(有数字辅助表时推荐)
如果数据库中有提前构建好的连续数字辅助表(表名nums,字段n存储1开始的连续整数),可以用关联写法替代递归,性能更高,尤其适合拆分条数多的场景:
SELECT s.client, DATEADD(DAY, s.[day]*(n.n-1), s.reminder_date) AS reminder_date FROM 业务表 s INNER JOIN nums n ON n.n <= s.generate_reminder ORDER BY s.client, reminder_date;
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

