Как выполнить будущие прогнозы движения денежных средств с помощью Teradata SQL? - PullRequest
0 голосов
/ 11 июня 2019

Я работаю над получением будущих денежных потоков с использованием SQL. Он включает непогашенный остаток, стандартный платеж, проценты и основную сумму. В настоящее время у меня есть отчет в Excel, но мне нужно получить то же самое в Teradata.

Я хотел бы разделить мой вопрос на две части:

  1. Получить текущий баланс и процентные ставки из таблицы (достаточно просто)

  2. Генерация будущих дат и проекта на следующие 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";

enter image description here

Как и на рисунке, конечное сальдо возвращается к полю начального сальдо, а проценты и основная сумма рассчитываются на основе этого нового значения начального сальдо.

Например, первая строка имеет значение начального сальдо как 100, проценты и основная сумма рассчитываются на основе 100 и затем вычитаются из начального сальдо для получения конечного сальдо, равного 99.70200384. В следующей строке это становится начальным балансом, и все остальные значения рассчитываются на основе этого.

Возможно ли это сделать в SQL?

1 Ответ

0 голосов
/ 13 июня 2019

Вам нужен рекурсивный 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
...