SQL Server-反向累积和
我有一笔累积的金额需要冲销。如何在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
+---+-------------------+-----+
| 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
。嗨,戈登,我非常喜欢你的工作,非常感谢你在这里帮助我们这些新手,请你看看我几天前发布的这个问题好吗?我真的很挣扎,不能让我的头周围,我可以我可能解决这个问题,请我会非常感谢你的帮助。嗨,戈登,我是你工作的忠实粉丝,非常感谢你在这里帮助我们这些新手,你能看看我几天前发布的这个问题吗?我真的很挣扎,不能让我的头周围,我可以我可能解决这个问题,请我会非常感谢你的帮助。