SQLServer:LAG& LEAD而不是递归计算

时间:2017-07-10 10:37:46

标签: sql sql-server recursion window-functions

我对新版本的SQL Server 2016很新,并且没有使用新的LAG& LEAD功能还没有。

如果我理解正确,那么在我们当前使用ROW_NUMBER()函数并进一步加入结果以按特定顺序连接记录的情况下,它将使工作更容易。

我目前使用这种方式连接记录的情况是:

;WITH IncrementingRowNums AS
(
    SELECT d.MyKey
          ,d.Outstanding
          ,d.Rate
          ,AMO.PaymentAmount
          ,AMO.AmoDate
          ,ROW_NUMBER() OVER (PARTITION BY d.MyKey ORDER BY AMO.AmoDate ASC) AS RowNum
      FROM Deals d
     INNER JOIN Amortization AMO
        ON d.MyKey = AMO.MyKey
),   
lagged AS
(
    SELECT MyKey 
          ,Outstanding AS new_outstanding
          ,Rate
          ,PaymentAmount
          ,AmoDate
          ,RowNum
      FROM IncrementingRowNums
     WHERE RowNum = 1
  UNION ALL
    SELECT i.MyKey
          ,(l.new_outstanding - l.PaymentAmount) 
            * (1 + i.Rate * (DATEDIFF(DAY,l.AmoDate, i.AmoDate)/365.25))    
             AS new_outstanding
          ,i.Rate
          ,i.PaymentAmount
          ,i.AmoDate
          ,i.RowNum
      FROM IncrementingRowNums i
     INNER JOIN lagged l
        ON i.RowNum = l.RowNum + 1
       AND i.MyKey = l.MyKey

使用LAG和LEAD功能解决此解决方案的最佳方法是什么? 我尝试了几种方法,但它从未解决过。

我唯一想要计算的是new_outstanding列。
其计算如下:

(previous_record.new_outstanding  - previous_record.PaymentAmount)
* (1 + current_record.Rate * (DATEDIFF(DAY,previous_record.AmoDate, current_record.AmoDate)/365.25))

由于rextester上没有SQL Server 2016版本,我只能提供一些测试数据和我以前的递归计算解决方案:http://rextester.com/WVTM46505 感谢

0 个答案:

没有答案