在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 实现
直接通过公式下拉完成递推:
- 假设数据从第2行开始(第1行是表头),
new_amount_cum列为E列:- 第2行(row=1)输入公式:
=D2-(B2*C2/1200) - 第3行(row=2)输入公式:
=(D3-((B3-E2)*C3/1200))+E2
- 第2行(row=1)输入公式:
- 选中第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
相关产品推荐
相关产品推荐

