【问题标题】:Using prior line record in next line record SQL在下一行记录 SQL 中使用前一行记录
【发布时间】:2019-01-10 20:43:41
【问题描述】:

[上面的数据集是我自己创建的。

我想要做的是循环最后一列 (New_UPB),让它成为下一行记录的第一列,并让数据集继续,直到 UPB 达到 0。]1

So that the outcome is this:

我的数据库中已经有所有字段作为临时表,我只需要弄清楚如何循环它直到分期完成,但不知道如何工作。

这是我的查询到目前为止的样子:

SELECT
AMS.Loan,
AMS.Payment#,
AMS.Due_Date,
AMS.UPB,
AMS.Int_Rate,
AMS.Total_PI,
AMS.Monthly_Int_Amt,
AMS.Monthly_Prin_Amt,
AMS.New_UPB

FROM    #AmSchedule AMS

WHERE   1=1

【问题讨论】:

  • 什么数据库? SQL 是一种语言,但不同的数据库实现它的方式不同。您所要求的听起来像是递归 SQL 或分析函数。将鼠标悬停在 SQL 标记上并阅读其说明。
  • 对不起 - 这是我的错字。那应该说数据集,而不是数据库。我为您在上面看到的数据集列创建了一个临时表。

标签: sql-server loops recursive-query amortization


【解决方案1】:

由于您使用的是 SQL Server,因此您可以使用递归公用表表达式。

递归 CTE 由结合在一起的两个互补查询组成。第一个查询是为递归或循环设置初始条件的锚点,而第二个查询通过执行自引用选择来进行递归。也就是说,它在其 from 子句中引用了 Recursive CTE:

  -- vvvvvvvvvvvv this is the Recursive CTEs name
with RecursiveCTE(Loan, Payment#, Due_Date, UPB, Int_Rate, Total_PI,
                  Monthly_Int_Amt, Monthly_Prin_Amt, New_UPB)
  as (
  -- The Anchor Query
  SELECT AMS.Loan,
         AMS.Payment#,
         AMS.Due_Date,
         AMS.UPB,
         AMS.Int_Rate,
         AMS.Total_PI,
         AMS.Monthly_Int_Amt,
         AMS.Monthly_Prin_Amt,
         AMS.New_UPB
    FROM #AmSchedule AMS

  UNION ALL

  -- The Recursive Part
  SELECT Prior.Loan,
         Prior.Payment# + 1,     -- Increment Pay#
         dateadd(mm, 1, Prior.Due_Date), -- Increment Due Date
         Prior.new_UPB,          -- <-- New_UPB from last iteration
         Prior.Int_Rate,
         Prior.Total_PI,
         Prior.Monthly_Int_Amt,  -- <-- Put your
         Prior.Monthly_Prin_Amt, -- <-- calculations
         Prior.New_UPB           -- <-- here
    FROM RecursiveCTE Prior
      -- ^^^^^^^^^^^^ this is what makes it recursive
)
-- Output the results
select * from RecursiveCTE 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 2020-12-22
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    相关资源
    最近更新 更多