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

SQL Server中基于历史计算结果递归计算NewDebit的实现问题

解决SQL Server中依赖前序计算结果的NewDebit值计算问题

因为NewDebit是依赖上一行计算结果的迭代值,普通分组、窗口函数(如SUM())无法处理这类场景——它们只能基于原始数据聚合,没法引用上一步的计算结果。递归CTE是最靠谱的解决方案,可实现逐行迭代计算。

实现代码

假设你的表名为your_table,先按date排序(若日期存在重复,需添加自增ID等字段保证排序唯一性):

WITH SortedData AS (
    -- 给数据排序并生成行号,用于递归关联前一行数据
    SELECT 
        date,
        qty,
        debit,
        ROW_NUMBER() OVER (ORDER BY date) AS rn
    FROM your_table
),
RecursiveCTE AS (
    -- 锚点成员:第一行的NewDebit直接取当前debit值
    SELECT 
        date,
        qty,
        debit,
        rn,
        CAST(debit AS DECIMAL(18,2)) AS NewDebit
    FROM SortedData
    WHERE rn = 1

    UNION ALL

    -- 递归成员:用上一行的NewDebit计算当前行的值
    SELECT 
        s.date,
        s.qty,
        s.debit,
        s.rn,
        -- 替换此处为你图示的具体公式!示例为通用迭代逻辑,需自行修改
        CAST(r.NewDebit + s.debit - s.qty AS DECIMAL(18,2)) AS NewDebit
    FROM SortedData s
    INNER JOIN RecursiveCTE r ON s.rn = r.rn + 1
)
-- 输出最终结果,按日期排序
SELECT date, qty, debit, NewDebit
FROM RecursiveCTE
ORDER BY date;

关键注意事项

  • 若date列存在重复值,必须在ROW_NUMBER()的ORDER BY中添加额外字段(如表的自增主键),否则排序顺序不稳定,会导致计算结果错误
  • 注意数据类型匹配,示例中使用DECIMAL(18,2)避免精度丢失,需根据你实际的数据类型调整
  • 递归默认最大层数为100,若数据行数超过该限制,需在语句末尾添加OPTION (MAXRECURSION 0)取消层数限制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:58:22