非常に非効率的ですが、ビューを使用した非常に単純なバージョンを以下に示します:
WITH DDView
AS (SELECT pd_curr.StockID,
pd_curr.Date,
pd_curr.Low_Price AS CurrPrice,
pd_prev.High_Price AS PrevPrice,
pd_curr.Low_Price / pd_prev.High_Price - 1.0 AS DD
FROM PriceData pd_curr
INNER JOIN PriceData pd_prev
ON pd_curr.StockID = pd_prev.StockID
AND pd_curr.Date >= pd_prev.Date
AND pd_curr.Low_Price <= pd_prev.High_Price
AND pd_prev.Date >= '2001-12-31' -- @param: min_date of analyzed period
WHERE pd_curr.Date <= '2010-09-31' -- @param: max_date of analyzed period
)
SELECT dd.StockID,
MIN(COALESCE(dd.DD, 0)) AS MaxDrawDown
FROM DDView dd
GROUP BY dd.StockID
通常は特定の期間で分析を実行するため、パラメータ @StartDate, @EndDate
を使用してストアド プロシージャでクエリをラップすることは理にかなっています。 おそらく @StockID
.繰り返しますが、これは設計上非常に非効率的です - O(N^2) ですが、適切なインデックスがあり、大量のデータがない場合、SQL Server はそれをうまく処理します。