1

我在雪花中有一个视图,它给了我以下信息:

  • 贷款日期
  • 贷款额度
  • 成人礼
  • 付款频率(每周、每两周、每半月、每月)
  • 支付金额

如果你愿意的话,我想从中生成一种摊销计划。因此,如果我的贷款日期为 2022 年 1 月 1 日,到期日为 2022 年 3 月 9 日,付款频率为每两周一次,每次付款 50 美元,我希望看到如下输出:

贷款ID 付款日期 支付金额 付款频率
abc123 2022 年 1 月 15 日 50.00 美元 双周刊
abc123 2022 年 1 月 29 日 50.00 美元 双周刊
abc123 2/12/2022 50.00 美元 双周刊
abc123 2022 年 2 月 26 日 50.00 美元 双周刊
abc123 2022 年 3 月 9 日 50.00 美元 双周刊

我假设我需要某种循环,而付款日期<到期日期和总和(付款金额)<贷款金额,但我不知道如何正确设置它以查看数千笔贷款。你们能提供的任何帮助都会令人难以置信,我非常感激!

4

2 回答 2

1

您可以通过编写Recursive CTE来获得它,只需记住默认限制为 100 次迭代,如果您需要更多循环,请检查此MAX_RECURSIONS参数。

这只是一个代码示例,您应该对其进行扩展以包含一些极端的数据保护;

样本数据:

CREATE OR REPLACE TABLE LoanTable (
    LoanID STRING,
    Loan_date DATE,
    Loan_amount NUMERIC(12,2),
    Maturity_date DATE,
    Payment_frequency STRING,
    Payment_amount NUMERIC(12,2)
);

INSERT INTO LoanTable
VALUES ('abc123', '1/1/2022', 250, '3/9/2022', 'biweekly', 50);

询问:

WITH Recursive_CTE AS (
  SELECT LoanID, 
         CASE Payment_frequency WHEN 'weekly'      THEN DATEADD(WEEK, 1, Loan_date)
                                WHEN 'biweekly'    THEN DATEADD(WEEK, 2, Loan_date)
                                WHEN 'semimonthly' THEN DATEADD(DAY, 15, Loan_date) -- I don't know how the semimonthly value is determined??
                                WHEN 'monthly'     THEN DATEADD(MONTH, 1, Loan_date) END AS Payment_Date,
         Payment_amount,
         Loan_amount - Payment_amount AS Left_to_pay,
         Payment_frequency,
         Maturity_date
    FROM LoanTable
   UNION ALL
  SELECT LoanID, 
         CASE Payment_frequency WHEN 'weekly'      THEN DATEADD(WEEK, 1, Payment_Date)
                                WHEN 'biweekly'    THEN DATEADD(WEEK, 2, Payment_Date)
                                WHEN 'semimonthly' THEN DATEADD(DAY, 15, Payment_Date) -- I don't know how the semimonthly value is determined??
                                WHEN 'monthly'     THEN DATEADD(MONTH, 1, Payment_Date) END AS Payment_Date,
         Payment_amount,
         IFF(Left_to_pay - Payment_amount < 0, Left_to_pay, Left_to_pay - Payment_amount) AS Left_to_pay,
         Payment_frequency,
         Maturity_date
    FROM Recursive_CTE  
   WHERE Left_to_pay > 0
)
SELECT LoanID, IFF(Payment_Date > Maturity_date, Maturity_date, Payment_Date) AS Payment_Date, Payment_amount, Left_to_pay, Payment_frequency
  FROM Recursive_CTE
 ORDER BY LoanID, Payment_Date;
于 2022-03-04T19:29:22.340 回答
0

表生成器是另一种方法。

WITH CTE_MY_DATE AS (
SELECT  DATEADD(DAY, SEQ4(), '1900-01-01') AS MY_DATE
FROM TABLE(GENERATOR(ROWCOUNT => 180000)) -- Number of days after reference date in previous line
)
SELECT
    date(MY_DATE) CALENDAR_DATE,
    concat( decode(extract ('dayofweek_iso', date(MY_DATE)),1,'Monday',2, 'Tuesday',3, 'Wednesday',4, 'Thursday',5, 'Friday',6, 'Saturday',7, 'Sunday'),TO_CHAR(date(MY_DATE), ', MMMM DD, YYYY')
) FULL_DATE_DESC  
    ,row_number() over (partition by 1 order by calendar_date ) modd
FROM
    CTE_MY_DATE
where
    CALENDAR_DATE 
        between '2022-01-02' and '2022-09-03' 
qualify 
    mod(modd, 14) = 0

在此处输入图像描述

于 2022-03-05T22:23:53.293 回答