Sql server 满足条件时重置累积和
我有一张这样的桌子Sql server 满足条件时重置累积和,sql-server,cumulative-sum,Sql Server,Cumulative Sum,我有一张这样的桌子 +----+--------+ | ID | Weight | +----+--------+ | 1 | 8100 | | 2 | 8235 | | 3 | 7950 | | 4 | 8175 | | 5 | 8185 | | 6 | 7985 | | 7 | 8180 | +----+--------+ 我想得到权重的累计和,当累计和大于或等于20000时,重置累计和 +----+--------+---------------
+----+--------+
| ID | Weight |
+----+--------+
| 1 | 8100 |
| 2 | 8235 |
| 3 | 7950 |
| 4 | 8175 |
| 5 | 8185 |
| 6 | 7985 |
| 7 | 8180 |
+----+--------+
我想得到权重的累计和,当累计和大于或等于20000时,重置累计和
+----+--------+----------------+----------------+
| ID | Weight | CumWeightBySum | ResetCumWeight |
+----+--------+----------------+----------------+
| 1 | 8100 | 8100 | 8100 |
| 2 | 8235 | 16335 | 16335 |
| 3 | 7950 | 24285 | 24285 |
| 4 | 8175 | 32460 | 8175 | <- Reset Cumulative Sum
| 5 | 8185 | 40645 | 16350 |
| 6 | 7985 | 48630 | 24335 |
| 7 | 8180 | 56810 | 8180 | <- Reset Cumulative Sum
+----+--------+----------------+----------------+
+----+--------+----------------+----------------+
|ID |重量| CumWeightBySum |重置CumWeight|
+----+--------+----------------+----------------+
| 1 | 8100 | 8100 | 8100 |
| 2 | 8235 | 16335 | 16335 |
| 3 | 7950 | 24285 | 24285 |
| 4 | 8175 | 32460 | 8175 |
在sql中执行类似操作的问题在于,由于sql在集合中工作,因此解决方案必须是递归的。复苏将是缓慢的。如果您在前端实现了这一点,那么就可以使用单个循环,而不需要递归。所以,除非有一个技巧,我不知道你真的想在前端这样做
这接近你想要的
SELECT s2.id, s2.weight,
-- total, x, z,
part, total,
SUM(s2.weight) OVER (PARTITION BY s2.part ORDER BY s2.id asc) as resetw
FROM (
SELECT id, weight,
total,
COALESCE(LAG(total) OVER (ORDER BY id asc) ,0) / 20000 as part
FROM (
select
id, weight,
SUM(weight) OVER (ORDER BY id asc) as total
from test
) s1
) s2
老实说,在前端这样做要容易得多,在SQL中这样做似乎是徒劳的
如果你想玩的话,这是小提琴
在sql中执行类似操作的问题在于,由于sql在集合中工作,因此解决方案必须是递归的。复苏将是缓慢的。如果您在前端实现了这一点,那么就可以使用单个循环,而不需要递归。所以,除非有一个技巧,我不知道你真的想在前端这样做
这接近你想要的
SELECT s2.id, s2.weight,
-- total, x, z,
part, total,
SUM(s2.weight) OVER (PARTITION BY s2.part ORDER BY s2.id asc) as resetw
FROM (
SELECT id, weight,
total,
COALESCE(LAG(total) OVER (ORDER BY id asc) ,0) / 20000 as part
FROM (
select
id, weight,
SUM(weight) OVER (ORDER BY id asc) as total
from test
) s1
) s2
老实说,在前端这样做要容易得多,在SQL中这样做似乎是徒劳的
如果你想玩的话,这是小提琴
如果ResetCumWeight
意味着每20000重置一次,那么它的列值不应该是810016335428512460645863016810
?@DaleK——一个有趣的注释——经常与简单的东西一起使用,应该不难实现——这显然不容易在SQL中实现。然而,我的尝试如下:D@Hogan问题的难易程度与OP是否尝试无关。相关的是OP是否成功。否则,我们只是一个代码编写服务。如果ResetCumWeight
意味着每20000重置一次,那么它的列值不应该是810016335428512460645863016810
?@DaleK——一个有趣的注释——经常与简单的东西一起使用,应该不难实现——这显然不容易实现SQL。然而,我的尝试如下:D@Hogan问题的难易程度与OP是否尝试无关。相关的是OP是否成功。否则,我们只是一个代码编写服务。