在SQL Server版本18.11.1中,我有一个目前无法解决的挑战.

我有一个列,其中的值如下:

ID Value Counters
1 6 1
2 1 1
3 1 1
4 4 1
5 5 1
6 6 1
7 7 1
8 8 1
9 9 1
10 10 1
11 1 1
12 1 1
13 1 1
14 1 1
15 3 1

我正在try 做的是一个滚动总和,将重新开始后,达到10或更多的滚动总和值或当滚动和计数器将超过3

期望值

Value Rolling_Sum Rolling_Counter_Sum
6 6 1
1 7 2
1 8 3 --restart trigger hit
4 4 1
5 9 2
6 15 --restart trigger hit 3
7 7 1
8 15 --restart trigger hit 2
9 9 1
10 19 --restart trigger hit 2
1 1 1
1 2 2
1 3 3 --restart as trigger hit
1 1 1
1 4 2

我已经try 了所有我能想象到的东西,读了很多公开的话题,但都找不到解决方案.请帮帮忙.

我正在考虑使用未绑定的前一行和当前行,但想不出如何在触发时重新启动它.

推荐答案

假设您已经有一个定义行顺序的列.如果使用recursive cte:

WITH cte (id, val, Rolling_Sum, Rolling_Counter_Sum) AS
(
    SELECT id, val, val AS Rolling_Sum, Counters as Rolling_Counter_Sum
    FROM mytable
    WHERE id = 1
    UNION ALL
    SELECT e.id, e.val, 
           case when d.Rolling_Sum < 10 and d.Rolling_Counter_Sum < 3
                then d.Rolling_Sum else 0 
           end + e.val,
           case when d.Rolling_Sum < 10 and d.Rolling_Counter_Sum < 3
                then d.Rolling_Counter_Sum else 0 
           end + e.Counters
    FROM mytable AS e
        INNER JOIN cte AS d
        ON e.id = d.id+1
    
)
SELECT id, Rolling_Sum, Rolling_Counter_Sum
from cte

结果:

id Rolling_Sum Rolling_Counter_Sum
1 6 1
2 7 2
3 8 3
4 4 1
5 9 2
6 15 3
7 7 1
8 15 2
9 9 1
10 19 2
11 1 1
12 2 2
13 3 3
14 1 1
15 4 2

这个递归查询通过将每行的"val"列中的值相加,直到累加和达到10来计算累加和.一旦累加和超过10,它就会将后续行的累加和重置为0.该查询从id等于1的初始行开始,通过连接具有连续ID的行来执行递归计算.

Demo here

Sql相关问答推荐

如何计算帐户在SQL中随着时间的推移购买的SKU数量?

SUM(条件)在Oracle?

如何通过比较不同表中相同ID S的值来筛选ID为S的列表?

SQL:如何将相应位置的两个数组中的元素组合在一起

如何计算一个用户S的日常连胜?

在迁移到.NET8后,使用Array.Containers的F#查询表达式失败

多条件SQL排序行为

在VB.NET中如何在MS Access数据库中创建SQL项目历史库存卡

使用多个WITH子查询的替代方法

SQL:使用年/月/日分区查询某个时间段的数据

SQL 查找 varchar 类型列及其值中多次出现的子字符串

如何为 ActiveRecord 联接应用附加条件

如何计算两个非周期性时间序列+分组的重叠持续时间

JSON对象查询SQL服务器

在自引用表中使用分组和计数的SQL查询语句

如何按日期和位置对最近 3 个报告日期的 SQL 查询结果进行透视?

Set vs let vs 在snowflake中声明变量

如何从 2 个 SQLite 表构建嵌套对象?

每组跨行曲折?

在 Athena / Presto 中提取 JSON 对象以获取动态密钥