sql >> Database >  >> RDS >> Sqlserver

Max Draw Down berekenen in SQL

Brutaal inefficiënte, maar zeer eenvoudige versie met een weergave staat hieronder:

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

Zoals gewoonlijk zou u de analyse uitvoeren op een specifieke tijdsperiode, zou het logisch zijn om de query in een opgeslagen procedure in te pakken met de parameters @StartDate, @EndDate en mogelijk @StockID . Nogmaals, dit is nogal inefficiënt van opzet - O(N^2), maar als je goede indices hebt en niet een enorme hoeveelheid gegevens, zal SQL Server het redelijk goed aankunnen.



  1. hoe de database opeenvolgend bij te werken met mysql

  2. Hoe krijg ik alleen cijfers van String in mysql?

  3. Algebraïsche gegevenstypen in Postgres

  4. mysqlfailover:geen module met de naam mysql.utilities.common.tools