Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

изчисляване на Max Draw Down в SQL

Брутално неефективна, но много проста версия, използваща изглед, е по-долу:

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

Тъй като обикновено извършвате анализа за конкретен период от време, би имало смисъл заявката да бъде обвита в съхранена процедура с параметрите @StartDate, @EndDate и евентуално @StockID . Отново, това е доста неефективно по дизайн - O(N^2), но ако имате добри индекси и не голямо количество данни, SQL Server ще се справи доста добре.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо редът на клаузите за присъединяване влияе върху плана на заявката в SQL Server?

  2. Принудително частично присъединяване в SQL Server

  3. SQL филтър за добавяне само ако променливата не е нулева

  4. Как да генерирам заявка за актуализиране на динамична заявка (автоматично)?

  5. Как да групирате йерархични връзки заедно в SQL Server