【问题标题】:Running Delta value on isolated rows - SQL Server 2008在隔离行上运行 Delta 值 - SQL Server 2008
【发布时间】:2016-09-20 07:48:48
【问题描述】:

我有下表,其中包含 Position_Date、Deal_Nr 和 Market Value 列。 现在我想创建第四列,计算每笔交易在 2 天内的市值增量。 例如交易编号 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   

【问题讨论】:

  • 能否请您写下您的预期结果。我的意思是你想展示什么

标签: sql-server sum delta


【解决方案1】:

您应该使用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

【讨论】:

  • @haggan 如果表有主键。使用A.Id &lt;&gt; B.Id 而不是A.Position_date &lt;&gt; B.Position_date
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
相关资源
最近更新 更多