La version brutalement inefficace, mais très simple utilisant une vue est ci-dessous :
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
Comme d'habitude vous effectueriez l'analyse sur une période de temps spécifique, il serait logique d'envelopper la requête dans une procédure stockée avec les paramètres @StartDate, @EndDate
et éventuellement @StockID
. Encore une fois, c'est assez inefficace de par sa conception - O(N^2), mais si vous avez de bons index et pas une énorme quantité de données, SQL Server le gérera assez bien.