Dưới đây là phiên bản không hiệu quả nhưng rất đơn giản sử dụng chế độ xem:
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
Như thường lệ, bạn sẽ thực hiện phân tích trong khoảng thời gian cụ thể, sẽ rất hợp lý khi gói truy vấn trong một thủ tục được lưu trữ với các tham số @StartDate, @EndDate
và có thể là @StockID
. Một lần nữa, điều này khá kém hiệu quả theo thiết kế - O (N ^ 2), nhưng nếu bạn có chỉ số tốt và lượng dữ liệu không lớn, SQL Server sẽ xử lý nó khá tốt.