1

開始値と、 TSQLだけを使用して各日付でNAVを取得するための最も効率的な方法を含む@pStartingValueテーブルを考えると、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変数をupdateステートメントにドロップすることで、両方を更新できます。これは次のように機能します。

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. 「パフォーマンス」テーブルには、実際には1つの資産しかありませんか?
于 2012-10-20T17:45:57.523 に答える