sql >> Databasteknik >  >> RDS >> Sqlserver

beräkna Max Draw Down i SQL

Brutalt ineffektiv, men väldigt enkel version med en vy är nedan:

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

Som du vanligtvis utför analysen på en specifik tidsperiod, skulle det vara vettigt att lägga in frågan i en lagrad procedur med parametrarna @StartDate, @EndDate och möjligen @StockID . Återigen, detta är ganska ineffektivt genom design - O(N^2), men om du har bra index och inte stora mängder data, kommer SQL Server att hantera det ganska bra.



  1. MySQL kolumntyp TIMESTAMP inkluderar implicit INTE NULL DEFAULT CURRENT_TIMESTAMP ON UPPDATERING CURRENT_TIMESTAMP

  2. Infoga formulärmatrisdata i MySQL med PHP

  3. Postgresql Aktuell tidsstämpel vid uppdatering

  4. Vilket är det enklaste sättet att fylla på tomma datum i SQL-resultat (antingen i mysql- eller perl-änden)?