Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLServer:LAG&;引导而不是递归计算_Sql_Sql Server_Recursion_Window Functions - Fatal编程技术网

SQLServer:LAG&;引导而不是递归计算

SQLServer:LAG&;引导而不是递归计算,sql,sql-server,recursion,window-functions,Sql,Sql Server,Recursion,Window Functions,我对SQL Server 2016的新版本非常陌生,还没有使用新的滞后和超前功能 如果我理解正确的话,在我们目前使用ROW_NUMBER()函数的情况下,它将使工作变得更容易,而且还会连接结果以按特定顺序连接记录 我目前使用这种方式连接记录的一种情况是: ;WITH IncrementingRowNums AS ( SELECT d.MyKey ,d.Outstanding ,d.Rate ,AMO.PaymentAmount

我对SQL Server 2016的新版本非常陌生,还没有使用新的滞后和超前功能

如果我理解正确的话,在我们目前使用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
用滞后和超前函数解决这个问题的最佳方法是什么? 我试过几种方法,但都没有成功

我唯一想计算的是列new_杰出
计算如下:

(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版本,我只能提供一些测试数据和我的递归计算的旧解决方案:
感谢

滞后和超前于2012年推出,因此它在rextester上得到了支持。而且,它们不是递归的。他们只能将另一行的值作为当前行中的额外列提供给您。@ZoharPeled感谢您提供的信息。似乎我以前从未注意过这些函数,所以没有递归就无法解决这个问题?你确定你的逻辑吗?您不必重新开始每个MyKey的计算吗,例如,
ROW_NUMBER()(按d.MyKey顺序按AMO.AmoDate ASC划分)
LAG
LEAD
在这里对您没有帮助。递归查询是给定问题的完美解决方案,因为您必须以迭代方式构建值(即,没有数学公式仅从当前行和上一行获取值)。