运行 孤立行的增量值 - SQL Server 2008

Running Delta value on isolated rows - SQL Server 2008

我有以下 table 列 Position_Date、Deal_Nr 和市场价值。 现在我想创建第四列来计算每笔交易在 2 天内的市场价值增量。 例如 Deal nr 100,MV 14/9 = 500。MV 13/9 = 600。500-600 = -100...

如果我在仓位日期上求和和分组,我知道如何做到这一点,但是有没有一种方法可以计算每笔交易的增量,而无需通过将 deal_nr 作为条件来计算?我有 100 种不同的 deal_nr,新的交易将会到来,所以我希望查询是静态的。

      Position_date |Deal_Nr|   Market Value    |   Delta Market Value
        2016-09-14  |   100 |   500             |   -100
        2016-09-14  |   101 |   1000            |   200
        2016-09-14  |   102 |   120             |   -30
        2016-09-14  |   103 |   400             |   -40
        2016-09-13  |   100 |   600             |   -300
        2016-09-13  |   101 |   800             |   100
        2016-09-13  |   102 |   150             |   -150
        2016-09-13  |   103 |   440             |   240
        2016-09-12  |   100 |   900             |   N/A
        2016-09-12  |   101 |   700             |   N/A
        2016-09-12  |   102 |   300             |   N/A
        2016-09-12  |   103 |   200             |   N/A

如果我要计算按位置日期分组的聚合增量,则以下方法有效。

          Select  
        Position_date,
        Market_Value,
        Delta_MV = sum(Market_value) - (select sum(Market_value) from t1 
                                       where position_Date = a.position_date -1 
                                       Group by position_date)

        from t1 as a
        Group by position_date   

您应该使用 LEFT JOIN 如下:

    DECLARE @Tbl TABLE (Position_date DATETIME, MarketValue INT,  Deal_Nr INT)
INSERT INTO @Tbl
VALUES 
('2016-09-14', 500 ,100  ),
('2016-09-14', 1000,101  ),
('2016-09-14', 120 ,102  ),
('2016-09-14', 400 ,103  ),
('2016-09-13', 600 ,100  ),
('2016-09-13', 800 ,101  ),
('2016-09-13', 150 ,102  ),
('2016-09-13', 440 ,103  ),
('2016-09-12', 900 ,100   ),
('2016-09-12', 700 ,101   ),
('2016-09-12', 300 ,102   ),
('2016-09-12', 200 ,103   )

SELECT
    A.Position_date,
    A.MarketValue,
    A.MarketValue - B.MarketValue AS DeltaMarketValue       
FROM
    @Tbl A LEFT JOIN 
    @Tbl B ON A.Deal_Nr = B.Deal_Nr AND 
              A.Position_date <> B.Position_date AND
              DATEADD(DAY, -1, A.Position_date) = B.Position_date

结果:

Position_date   MarketValue DeltaMarketValue
--------------- ----------- ----------------
2016-09-14          500         -100
2016-09-14          1000        200
2016-09-14          120         -30
2016-09-14          400         -40
2016-09-13          600         -300
2016-09-13          800         100
2016-09-13          150         -150
2016-09-13          440         240
2016-09-12          900         NULL
2016-09-12          700         NULL
2016-09-12          300         NULL
2016-09-12          200         NULL