Di seguito è riportata una versione brutalmente inefficiente, ma molto semplice che utilizza una vista:
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
Poiché di solito eseguiresti l'analisi in un periodo di tempo specifico, avrebbe senso racchiudere la query in una procedura memorizzata con i parametri @StartDate, @EndDate
ed eventualmente @StockID
. Ancora una volta, questo è abbastanza inefficiente in base alla progettazione - O(N^2), ma se hai buoni indici e non un'enorme quantità di dati, SQL Server lo gestirà abbastanza bene.