同樣將以2013-08-29至2013-09-04期間的『富達新興市場』基金淨值為例,先前曾以提供LEAD/LAG分析函數計算每日基金淨值漲跌幅,SQL2005、2008版本尚未支援LAG/LEAD函數,則可利用ROW_NUMBER函數產生期數序號(Seq),並以Self-Join建立前後期(t-1、t)對應關係以計算出所需結果,SQL/結果如下:
重點1:期數序號產生
以ROW_NUMBER產生期數序號(Seq),範例是以單一支基金為例,多支基金則應搭配PARTITION BY,並以WITH將前述產生結果暫存,命名為Fund。
重點2:建立前/後期對應關係
可用Self Join方式將Fund暫存資料虛擬為前期(Pre,t-1)、後期(Curr,t)兩份資料,將以ROW_NUMBER產生之序號(Seq)以Curr.Seq = Pre.Seq-1進行前後期連結,為得到與LAG函數得到相同結果將以OUTER JOIN方式結合。
本範例重點在模擬LAG、LEAD函數可能之運作概念,由WHERE條件進行篩選可得結果集(一份)並予以暫存(可能以Memory或HD方式),再以期數Offset值建立前後期關聯性,將同一資料列(Row)中之前後期資料進行運算即為所求。建議同時參考『計算基金漲跌計算-LAG/LEAD分析函數介紹』之作法,並思考兩者異同點,可供後續SQL撰寫之另一思考途徑。
沒有留言:
張貼留言