2013年9月13日 星期五

基金漲跌計算-以ROW_NUMBER為例

同樣將以2013-08-292013-09-04期間的『富達新興市場』基金淨值為例,先前曾以提供LEAD/LAG分析函數計算每日基金淨值漲跌幅,SQL20052008版本尚未支援LAG/LEAD函數,則可利用ROW_NUMBER函數產生期數序號(Seq),並以Self-Join建立前後期(t-1t)對應關係以計算出所需結果,SQL/結果如下:
功能
SQL (當月日曆)
說明
SQL
WITH Fund
AS
(
SELECT F.*
, ROW_NUMBER() OVER(ORDER BY NAV_DATE DESC) Seq --重點1
FROM #FUND F
)
SELECT Curr.Seq
     , Curr.NAV_DATE
     , Curr.NAV
     , Pre.NAV         Pre_NAV                             
     , Pre.Seq
     , Pre.NAV_DATE
FROM Fund Curr
     LEFT OUTER JOIN Fund Pre     --重點2
         ON Curr.Seq = Pre.Seq -1  --重點2
重點1:期數序號產生
ROW_NUMBER產生期數序號(Seq)。

重點2:建立前/後期對應關係
Curr.Seq = Pre.Seq-1進行前後期連結。
結果


重點1:期數序號產生
ROW_NUMBER產生期數序號(Seq),範例是以單一支基金為例,多支基金則應搭配PARTITION BY,並以WITH將前述產生結果暫存,命名為Fund

重點2:建立前/後期對應關係
可用Self Join方式將Fund暫存資料虛擬為前期(Pret-1)、後期(Currt)兩份資料,將以ROW_NUMBER產生之序號(Seq)Curr.Seq = Pre.Seq-1進行前後期連結,為得到與LAG函數得到相同結果將以OUTER JOIN方式結合。


本範例重點在模擬LAGLEAD函數可能之運作概念,由WHERE條件進行篩選可得結果集(一份)並予以暫存(可能以MemoryHD方式),再以期數Offset值建立前後期關聯性,將同一資料列(Row)中之前後期資料進行運算即為所求。建議同時參考『計算基金漲跌計算-LAG/LEAD分析函數介紹』之作法,並思考兩者異同點,可供後續SQL撰寫之另一思考途徑。

沒有留言:

張貼留言