Sangat tidak efisien, tetapi versi yang sangat sederhana menggunakan tampilan di bawah ini:
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
Seperti biasanya Anda akan melakukan analisis pada periode waktu tertentu, masuk akal untuk membungkus kueri dalam prosedur tersimpan dengan parameter @StartDate, @EndDate
dan mungkin @StockID
. Sekali lagi, ini cukup tidak efisien menurut desain - O(N^2), tetapi jika Anda memiliki indeks yang bagus dan jumlah data yang tidak besar, SQL Server akan menanganinya dengan cukup baik.