Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

obliczanie Max Draw Down w SQL

Brutalnie nieefektywna, ale bardzo prosta wersja korzystająca z widoku jest poniżej:

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

Jak zwykle przeprowadzasz analizę w określonym przedziale czasu, sensowne byłoby owinięcie zapytania w procedurę składowaną z parametrami @StartDate, @EndDate i ewentualnie @StockID . Znowu jest to dość nieefektywne z założenia - O(N^2), ale jeśli masz dobre indeksy i niewielką ilość danych, SQL Server poradzi sobie z tym całkiem nieźle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przyznaj uprawnienie SELECT do widoku, ale nie do obiektów leżących poniżej

  2. Zrozumienie funkcji zabezpieczeń programu SQL Server HAS_Permis_BY_Name i jej przypadków użycia

  3. Użyj DATABASEPROPERTYEX(), aby zwrócić ustawienia bazy danych w SQL Server

  4. Różnica między wartościami każdego wiersza - Błąd sumy

  5. Zaktualizować tabelę za pomocą JOIN w programie SQL Server?