我有一个这样的桌子
+----+--------+
| 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
+----+--------+----------------+----------------+
答案 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进行操作似乎很费力。
如果你想玩的话,这里是小提琴