如何使用 Teradata SQL 执行未来现金流量预测?
How to perform future cashflow projections using Teradata SQL?
我正在努力使用 SQL 获得未来的现金流。它包括未结余额、标准付款、利息和本金。目前我在 excel 中有报告,但我需要在 Teradata 中得到完全相同的东西。
我想把我的问题分为两部分:
从 table 获取当前余额和利率(足够简单)
生成未来 20 天的未来日期和项目(不确定如何操作)
到目前为止,我已经尝试了 windows 功能,但无法做到。
SELECT
"Account Number"
,"Business Date"
,"Outstanding Balance"
,"Standard Payment"
,"Current Balance" - "Standard Payment" "Dummy Balance"
,MAX("Dummy Balance" ) OVER (PARTITION BY "Account Number" ORDER BY "Business Date" ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING )"Prev Balance"
FROM table
where [<Conditions>]
GROUP BY 1,2,3,4
ORDER BY "NEXT DAYS";
如图所示,期末余额回到期初余额字段,利息和本金是根据这个新的期初余额值计算的。
例如,第一行的期初余额为100,在100的基础上计算利息和本金,然后从期初余额中减去,得到期末余额为99.70200384。在下一行中,这成为期初余额,所有其他值均基于此计算。
这可以在 SQL 中完成吗?
你需要一些递归 SQL。假设您每个帐户一行,并希望获得接下来的 10 天:
WITH RECURSIVE cte AS
(
SELECT
account_number,
Cast(100 AS DECIMAL(38,8)) AS balance,
0.56466283 AS payment,
0.00266666667 AS interest_rate,
balance * interest_rate AS interest,
payment - interest AS principal,
balance - principal AS end_balance,
Current_Date AS dt
FROM mytable
UNION ALL
SELECT
account_number,
end_balance,
payment,
interest_rate,
end_balance * interest_rate AS new_interest,
payment - new_interest AS new_principal,
end_balance - new_principal AS new_balance,
dt+1 as new_dt
FROM cte
WHERE new_dt < Current_Date+10
)
SELECT *
FROM cte
ORDER BY account_number, dt
我正在努力使用 SQL 获得未来的现金流。它包括未结余额、标准付款、利息和本金。目前我在 excel 中有报告,但我需要在 Teradata 中得到完全相同的东西。
我想把我的问题分为两部分:
从 table 获取当前余额和利率(足够简单)
生成未来 20 天的未来日期和项目(不确定如何操作)
到目前为止,我已经尝试了 windows 功能,但无法做到。
SELECT
"Account Number"
,"Business Date"
,"Outstanding Balance"
,"Standard Payment"
,"Current Balance" - "Standard Payment" "Dummy Balance"
,MAX("Dummy Balance" ) OVER (PARTITION BY "Account Number" ORDER BY "Business Date" ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING )"Prev Balance"
FROM table
where [<Conditions>]
GROUP BY 1,2,3,4
ORDER BY "NEXT DAYS";
如图所示,期末余额回到期初余额字段,利息和本金是根据这个新的期初余额值计算的。
例如,第一行的期初余额为100,在100的基础上计算利息和本金,然后从期初余额中减去,得到期末余额为99.70200384。在下一行中,这成为期初余额,所有其他值均基于此计算。
这可以在 SQL 中完成吗?
你需要一些递归 SQL。假设您每个帐户一行,并希望获得接下来的 10 天:
WITH RECURSIVE cte AS
(
SELECT
account_number,
Cast(100 AS DECIMAL(38,8)) AS balance,
0.56466283 AS payment,
0.00266666667 AS interest_rate,
balance * interest_rate AS interest,
payment - interest AS principal,
balance - principal AS end_balance,
Current_Date AS dt
FROM mytable
UNION ALL
SELECT
account_number,
end_balance,
payment,
interest_rate,
end_balance * interest_rate AS new_interest,
payment - new_interest AS new_principal,
end_balance - new_principal AS new_balance,
dt+1 as new_dt
FROM cte
WHERE new_dt < Current_Date+10
)
SELECT *
FROM cte
ORDER BY account_number, dt