Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 满足条件时重置累积和_Sql Server_Cumulative Sum - Fatal编程技术网

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是否成功。否则,我们只是一个代码编写服务。