Brutal ineffiziente, aber sehr einfache Version, die eine Ansicht verwendet, ist unten:
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
Da Sie die Analyse normalerweise für einen bestimmten Zeitraum durchführen würden, wäre es sinnvoll, die Abfrage in eine gespeicherte Prozedur mit den Parametern @StartDate, @EndDate
einzuschließen und eventuell @StockID
. Auch dies ist vom Design her ziemlich ineffizient - O(N^2), aber wenn Sie gute Indizes und keine große Datenmenge haben, wird SQL Server damit ziemlich gut umgehen.