Использование записи предыдущей строки в записи SQL следующей строки - PullRequest
0 голосов
/ 10 января 2019

[Набор данных выше - это то, что я создал.

Что я хотел бы сделать, так это зациклить последний столбец (New_UPB), чтобы он был первым столбцом в следующей строке записей, и чтобы набор данных продолжался до тех пор, пока UPB не достигнет 0.] 1

Так что результат таков:

У меня все поля уже есть в моей базе данных как временная таблица, мне просто нужно выяснить, как это сделать, пока не завершатся платежи, но не уверен, как это сделать.

Вот так выглядит мой запрос:

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 голосов
/ 11 января 2019

Поскольку вы используете SQL Server, вы можете использовать рекурсивное общее табличное выражение.

Рекурсивный CTE, состоит из двух дополнительных запросов, объединенных вместе. Первый запрос - это якорь, который устанавливает начальные условия для рекурсии или зацикливания, в то время как второй запрос выполняет рекурсию, выполняя самореференциальный выбор. То есть он ссылается на Рекурсивный CTE в предложении from:

  -- 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 
...