SQL Server-反向累积和

SQL Server-反向累积和,sql,sql-server,cumulative-sum,Sql,Sql Server,Cumulative Sum,我有一笔累积的金额需要冲销。如何在SQL Server中执行此操作 例如: +---+-------------------+-----+ | id| date|value| +---+-------------------+-----+ | J1|2016-10-01 11:45:30| 100| | J1|2016-10-02 11:30:30| 200| | J1|2016-10-05 16:20:00| 400| | J9|2016-10-06 08:3

我有一笔累积的金额需要冲销。如何在SQL Server中执行此操作

例如:

+---+-------------------+-----+
| id|               date|value|
+---+-------------------+-----+
| J1|2016-10-01 11:45:30|  100|
| J1|2016-10-02 11:30:30|  200|
| J1|2016-10-05 16:20:00|  400|
| J9|2016-10-06 08:35:00|  800|
| J9|2016-10-07 01:20:00|  900|
+---+-------------------+-----+
所需数据帧:

+---+-------------------+-----+---------+
| id|               date|value|non_cum_value|
+---+-------------------+-----+---------+
| J1|2016-10-01 11:45:30|  100|        0|
| J1|2016-10-02 11:30:30|  200|      100|
| J1|2016-10-05 16:20:00|  400|      200|
| J9|2016-10-06 08:35:00|  800|      400|
| J9|2016-10-07 01:20:00|  900|      100|
+---+-------------------+-----+---------+
我的代码:

select t1.id, t1.value, DIFFERENCE(t1.value) as 'cum_sum'
from @t t1
inner join @t t2 on t1.id >= t2.id
group by t1.id, t1.value
order by t1.id

嗯。您似乎想从“上一行”中减去该值。这将是:

select t.*,
       (t.value - lag(t.val) over (order by date)) as diff
from @t;

我不知道为什么标题中有“累计金额”。这无助于我理解你想做什么。

嗯。您似乎想从“上一行”中减去该值。这将是:

select t.*,
       (t.value - lag(t.val) over (order by date)) as diff
from @t;

我不知道为什么标题中有“累计金额”。这无助于我理解您试图做什么。

另一种可能性是:

SELECT *, V - SUM(V) OVER(ORDER BY D ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
FROM   T
假设测试数据为:

CREATE TABLE T (ID CHAR(2), D DATE, V FLOAT);

INSERT INTO T VALUES 
('J1', '2016-10-01 11:45:30',   100),
('J1', '2016-10-02 11:30:30',   200),
('J1', '2016-10-05 16:20:00',   400),
('J9', '2016-10-06 08:35:00',   800),
('J9', '2016-10-07 01:20:00',   900);

另一种可能性是:

SELECT *, V - SUM(V) OVER(ORDER BY D ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
FROM   T
假设测试数据为:

CREATE TABLE T (ID CHAR(2), D DATE, V FLOAT);

INSERT INTO T VALUES 
('J1', '2016-10-01 11:45:30',   100),
('J1', '2016-10-02 11:30:30',   200),
('J1', '2016-10-05 16:20:00',   400),
('J9', '2016-10-06 08:35:00',   800),
('J9', '2016-10-07 01:20:00',   900);

我迷路了。逻辑是什么?如果你追求的是一个实际的累计总和,那么逻辑与你通常的做法没有什么不同;只需将
订单的顺序从
ASC
更改为
DESC
。我迷路了。逻辑是什么?如果你追求的是一个实际的累计总和,那么逻辑与你通常的做法没有什么不同;只需将
order BY
的顺序从
ASC
更改为
DESC
。嗨,戈登,我非常喜欢你的工作,非常感谢你在这里帮助我们这些新手,请你看看我几天前发布的这个问题好吗?我真的很挣扎,不能让我的头周围,我可以我可能解决这个问题,请我会非常感谢你的帮助。嗨,戈登,我是你工作的忠实粉丝,非常感谢你在这里帮助我们这些新手,你能看看我几天前发布的这个问题吗?我真的很挣扎,不能让我的头周围,我可以我可能解决这个问题,请我会非常感谢你的帮助。