在下一行记录SQL中使用上一行记录

时间:2019-01-10 20:43:41

标签: sql-server loops recursive-query amortization

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

我想做的是循环最后一列(New_UPB),并将其作为下一行记录的第一列,并使数据集继续直到UPB达到0。] 1 < / p>

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

1 个答案:

答案 0 :(得分:0)

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

递归CTE由两个互补的查询联合而成。第一个查询是锚,它为递归或循环设置了初始条件,而第二个查询通过执行自引用选择来进行递归。也就是说,它在其from子句中引用了递归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