MySQL中如何基于同一计算列Payment Due的上期值计算当期值
解决方案
你需要计算的Payment Due属于逐行递归依赖的指标,每一期的结果依赖上一期计算好的Payment Due值,普通LAG窗口函数只能读取原始表中存储的历史字段值,无法读取动态生成的上一期计算结果,所以用递归CTE是最通用的实现方案。
具体实现逻辑:
- 先取第一个月的数据作为递归的初始锚点,第一期的Payment Due为已知的固定值0
- 递归关联计算后续每个月的数据,每次递归都可以拿到上一期已经计算完成的Payment Due和Payment Made值,代入你给出的规则计算当期Payment Due即可
通用SQL实现代码如下:
WITH RECURSIVE payment_calc AS ( -- 锚点:取第一个月的原始数据 SELECT Month, Payment_Made, Payment_Required, Payment_Due FROM 你的支付数据表名 WHERE Month = 1 UNION ALL -- 递归计算后续每个月的Payment Due SELECT t.Month, t.Payment_Made, t.Payment_Required, CASE WHEN prev.Payment_Made < prev.Payment_Due THEN prev.Payment_Due + t.Payment_Required - prev.Payment_Made ELSE t.Payment_Required END AS Payment_Due FROM 你的支付数据表名 t INNER JOIN payment_calc prev ON t.Month = prev.Month + 1 ) SELECT * FROM payment_calc ORDER BY Month;
注意事项
- 如果你用的是SQL Server,去掉
WITH后面的RECURSIVE关键字即可,SQL Server默认支持CTE递归 - 如果你的月份字段不是连续的整数,可以先用
ROW_NUMBER() OVER (ORDER BY 日期/Month) AS rn给所有数据生成连续行号,再用rn字段代替Month做递归关联即可 - 上述代码计算出的结果和你给出的示例完全匹配,可直接验证
内容的提问来源于stack exchange,提问作者Rohit Lodha
相关产品推荐
相关产品推荐

