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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:45:05