sql >> Database teknologi >  >> RDS >> Sqlserver

beregning af Max Draw Down i SQL

Brutalt ineffektiv, men meget enkel version med en visning er nedenfor:

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 normalt ville du udføre analysen på en bestemt tidsperiode, ville det give mening at indpakke forespørgslen i en lagret procedure med parametrene @StartDate, @EndDate og muligvis @StockID . Igen, dette er ret ineffektivt af design - O(N^2), men hvis du har gode indekser og ikke store mængder data, vil SQL Server håndtere det ret godt.



  1. Returner en lagret procedure ud af cursorvariabel i cx_oracle

  2. Flerniveaubrugere i databasetabellen

  3. Design af en datamodel til et hotelværelsesreservationssystem

  4. Server tager lang tid at svare