满足条件时重置累计和

时间:2020-07-03 02:30:51

标签: sql-server cumulative-sum

我有一个这样的桌子

+----+--------+
| 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
+----+--------+----------------+----------------+

1 个答案:

答案 0 :(得分:0)

在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进行操作似乎很费力。

如果你想玩的话,这里是小提琴

http://sqlfiddle.com/#!18/1111a1/28