SQLServer:LAG&;引导而不是递归计算
我对SQL Server 2016的新版本非常陌生,还没有使用新的滞后和超前功能 如果我理解正确的话,在我们目前使用ROW_NUMBER()函数的情况下,它将使工作变得更容易,而且还会连接结果以按特定顺序连接记录 我目前使用这种方式连接记录的一种情况是: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
;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
在这里对您没有帮助。递归查询是给定问题的完美解决方案,因为您必须以迭代方式构建值(即,没有数学公式仅从当前行和上一行获取值)。