运行 孤立行的增量值 - 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
我有以下 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