Как мне разрешить циклическую ссылку в этом заявлении LAG? - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужно использовать LAG, чтобы получить значение EndingUnits последней строки и использовать его в качестве OpeningUnits для текущей строки. Частично проблема заключается в том, что я не могу использовать ни один из псевдонимов, таких как EndingUnits или OpeningUnits в операторе выбора, где они определены. Другой проблемой является определение EndingUnits, основанное на OpeningUnits, которое само зависит от EndingUnits.

Единственная задействованная таблица - это DividendPricing, которая выглядит так:

DividendPricingID PK, int
FiscalPeriod smalldatetime
DivPrice money
DivFactor float

-

OpeningUnits = LAG(EndingUnits, 1, 1) OVER (ORDER BY FiscalPeriod)
DRIP = (LAG(EndingUnits, 1, 1) OVER (ORDER BY FiscalPeriod))/DivPrice*DivFactor
EndingUnits = OpeningUnits + DRIP

Мой запрос выглядит так, но, очевидно, не работает:

SELECT FiscalPeriod,
    LAG(EndingUnits, 1, 1) OVER (ORDER BY FiscalPeriod) AS OpeningUnits,
    DivPrice,
    DivFactor,
    LAG(EndingUnits, 1, 1) OVER (ORDER BY FiscalPeriod)/DivPrice*DivFactor AS [DRIP],
    LAG(EndingUnits, 1, 1) OVER (ORDER BY FiscalPeriod) + (LAG(EndingUnits, 1, 1) OVER (ORDER BY FiscalPeriod)/DivPrice*DivFactor) AS EndingUnits
    FROM DividendPricing

1 Ответ

0 голосов
/ 08 ноября 2018

Я не совсем понимаю, какой результат вы ожидаете, однако, чтобы использовать LAG () так, как вы намерены, вам нужно подтянуть его с начальной точки.Я собрал этот пример с использованием CTE, возможно, он может помочь найти идеальное решение в вашем случае.

DECLARE @T TABLE(FiscalPeriod SMALLDATETIME,DivPrice MONEY,DivFactor FLOAT)
INSERT @T VALUES
    ('01/01/2012',2,1.2),('04/01/2012',4,1.23),('07/01/2012',6,1.1),('10/01/2012',8,1.15),
    ('01/01/2013',2,1.2),('04/01/2013',4,1.23),('07/01/2013',6,1.1),('10/01/2013',8,1.15)

;WITH Start AS
(
    SELECT 
        EndingUnits = 1, FiscalPeriod,DivPrice, DivFactor 
    FROM 
        @T       
)
,NormalizedEnding AS
(
    SELECT 
        FiscalPeriod, DivPrice, DivFactor,
        EndingUnits = LAG(EndingUnits, 1, 1) OVER (ORDER BY FiscalPeriod) + (LAG(EndingUnits, 1, 1) OVER (ORDER BY FiscalPeriod) / DivPrice * DivFactor) 
    FROM 
        Start 
),
ContinuationCalulation AS
(
    SELECT
        FiscalPeriod,DivPrice,DivFactor,
        OpeningUnits =  LAG(EndingUnits, 1, 1) OVER (ORDER BY FiscalPeriod),
        DRIP = (LAG(EndingUnits, 1, 1) OVER (ORDER BY FiscalPeriod))/DivPrice*DivFactor,
        x=EndingUnits
    FROM
        NormalizedEnding
)
SELECT
    FiscalPeriod,DivPrice,DivFactor,OpeningUnits,
    EndingUnits = OpeningUnits + DRIP,
    x
FROM
    ContinuationCalulation 
...