1

给定起始值和@pStartingValue一个表,其中包含仅使用 TSQL 在每个日期获取 NAV 的最有效方法是什么?rorDateror

这在数学上微不足道,而且代码简单。我目前有一个依赖游标的简单 SQL 实现。

在第一个日期,NAV 是 @pStartingValue * ror
在随后的每个日期,它是之前计算的 nav * ror或者它是 @pStartingValue * 每个之前的 ror

您将如何仅在 MSSQL2005+ 中有效地做到这一点?

DECLARE @rorDate DATE
DECLARE @getDate CURSOR
DECLARE @lastNAV as DECIMAL(19,7)
DECLARE @datedRoR as float
DECLARE @NAVTotals TABLE
(
  NAV DECIMAL(19,7),
  navDate DATE
)


SET @lastNAV = 100

SET @getDate = CURSOR FOR
    SELECT 
        p.[DATE]
    FROM 
        performance p 
    ORDER BY 
        p.[DATE]

OPEN @getDate
FETCH NEXT
FROM @getDate INTO @rorDate
WHILE @@FETCH_STATUS = 0
BEGIN

SELECT 
    @datedRoR = b.finalNetReturn 
FROM 
    performance b 
WHERE 
    b.date = @rorDate

INSERT INTO @NAVTotals (NAV, navDate)
  VALUES (@lastNAV * (1 + @datedRoR), @rorDate)

SELECT 
    @lastNAV = c.NAV 
FROM 
    @NAVTotals c 
WHERE 
    c.navDate = @rorDate  


FETCH NEXT
FROM @getDate INTO @rorDate
END
CLOSE @getDate
DEALLOCATE @getDate

select * from @NAVTotals
4

2 回答 2

1

您必须进行一些测试以查看性能是否有所提高,但这是一种无需使用光标即可完成相同操作的方法。它未经测试,因此您需要确保对其进行测试。我也铸造b.finalNetReturn成一个浮动,如果它已经是一个浮动,你可以删除该部分。

DECLARE @lastNAV as DECIMAL(19,7)

SET @lastNAV = 100    

DECLARE @NAVTotals TABLE
(
  NAV DECIMAL(19,7),
  navDate DATE
);

INSERT INTO @NAVTotals (navDate) 
   SELECT [DATE]
    FROM performance
    ORDER BY [DATE] ASC;

UPDATE NT
SET @lastNAV = Nav = (@lastNAV * (1.0 +
 (Cast((SELECT b.finalNetReturn 
        FROM performance b 
        WHERE b.date = NT.navDate) AS FLOAT)))) 
FROM @NAVTotals NT;

SELECT * FROM @NAVTotals ORDER BY navDate;

通过将 lastNAV 变量放入更新语句中,您可以同时更新两者。它的工作原理类似于:

a = a + 1

这里有一个相同方法的示例。包括一些很好的数字,用于比较该方法与其他方法(如游标)的效率。

于 2012-10-19T21:54:47.153 回答
0

也许我没有正确理解它,但你甚至不需要存储过程来实现这一点。

SELECT p.[DATE] AS navDate
     , @pStartingValue * PRODUCT(1 + b.finalNetReturn) AS NAV
  FROM performance p
 INNER JOIN performance b
    ON b.[DATE] <= p.[DATE]
 GROUP BY p.[DATE]
 ORDER BY p.[DATE]

但是,有一些我没有掌握的“怪异之处”。

  1. 为什么 p.[DATE] 没有范围限制?
  2. “性能”表真的只有一项资产吗?
于 2012-10-20T17:45:57.523 回答