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

在Teradata中计算当前行时引用上一行的计算结果

如何创建依赖上一行计算结果的累积列new_amount_cum

这种递推式累积计算需要逐行引用上一行的计算结果,普通聚合函数(比如cumsum)无法直接实现,下面针对几种常用工具给出具体实现方案:

Python Pandas 实现

通过逐行迭代完成递推计算,步骤如下:

import pandas as pd

# 构造示例数据
data = {
    'row': [1, 2, 3],
    'debt': ['93084,79', '93084,79', '93084,79'],
    'perc': ['2,89', '2,89', '2,89'],
    'annu_amount': ['536,77', '536,77', '536,77']
}
df = pd.DataFrame(data)

# 转换数值格式:替换逗号为小数点,转为float类型
for col in ['debt', 'perc', 'annu_amount']:
    df[col] = df[col].str.replace(',', '.').astype(float)

# 初始化目标列
df['new_amount_cum'] = 0.0

# 递推计算每一行的值
for idx in df.index:
    if idx == 0:
        # 第一行使用初始公式
        df.loc[idx, 'new_amount_cum'] = df.loc[idx, 'annu_amount'] - (df.loc[idx, 'debt'] * df.loc[idx, 'perc'] / 1200)
    else:
        # 后续行引用上一行的计算结果
        prev_cum = df.loc[idx-1, 'new_amount_cum']
        df.loc[idx, 'new_amount_cum'] = (df.loc[idx, 'annu_amount'] - ((df.loc[idx, 'debt'] - prev_cum) * df.loc[idx, 'perc'] / 1200)) + prev_cum

# 格式还原(可选:保留两位小数,转回逗号分隔)
df['new_amount_cum'] = df['new_amount_cum'].round(2).astype(str).str.replace('.', ',')
print(df)

核心逻辑是通过循环逐行计算,每一步都依赖上一行的new_amount_cum值,运行后会得到预期结果。

Excel 实现

直接通过公式下拉完成递推:

  1. 假设数据从第2行开始(第1行是表头),new_amount_cum列为E列:
    • 第2行(row=1)输入公式:=D2-(B2*C2/1200)
    • 第3行(row=2)输入公式:=(D3-((B3-E2)*C3/1200))+E2
  2. 选中第3行单元格,下拉填充到后续行即可,Excel会自动引用上一行的E列值完成计算。

SQL(以PostgreSQL为例)

使用递归CTE(Common Table Expression)实现递推计算:

WITH recursive cte AS (
    -- 基础查询:计算第一行的初始值
    SELECT 
        row,
        debt::numeric,
        perc::numeric,
        annu_amount::numeric,
        (annu_amount::numeric - (debt::numeric * perc::numeric / 1200)) AS new_amount_cum
    FROM your_table
    WHERE row = 1
    
    UNION ALL
    
    -- 递归查询:逐行计算后续值,引用上一行的结果
    SELECT 
        t.row,
        t.debt::numeric,
        t.perc::numeric,
        t.annu_amount::numeric,
        (t.annu_amount::numeric - ((t.debt::numeric - c.new_amount_cum) * t.perc::numeric / 1200)) + c.new_amount_cum
    FROM your_table t
    JOIN cte c ON t.row = c.row + 1
)
-- 输出结果(格式化为逗号分隔的小数)
SELECT 
    row,
    TO_CHAR(debt, 'FM999999999D99') AS debt,
    TO_CHAR(perc, 'FM99D99') AS perc,
    TO_CHAR(annu_amount, 'FM9999D99') AS annu_amount,
    TO_CHAR(new_amount_cum, 'FM9999D99') AS new_amount_cum
FROM cte 
ORDER BY row;

递归CTE先计算第一行的初始值,再通过JOIN关联上一行数据,逐行推导后续结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:45:50