首页 > 解决方案 > 范围受限的 SQL Server 累积总和

问题描述

给定一张人员表和与他们的评估相关的分数,我需要获得他们每次评估的累积分数(按人)。

评估日期 分数
2012 -12
休伯特 2014 -5
2020 -5
2015 +16
休伯特 2011 -100

他们的分数从 100 开始,不能低于 0 或超过 100。如果在某个时间分数超过 100(或低于 0),则从 100(或 0)开始计算下一个累积分数。

预期输出:

评估日期 分数 累积分数
休伯特 2011 -100 0
休伯特 2014 -5 0
2012 -12 88
2015 +16 100
2020 -5 95

有些帖子描述了如何进行累积和,但没有解释如何通过每个操作将其限制在一个范围内。

标签: sqlsql-servertsql

解决方案


正如@LukaszSzozda 在他的评论中建议的那样,您可以使用递归 CTE。

with t as (
   select Person, EvaluationDate, Casescore,
       row_number() over(partition by Person order by EvaluationDate) rn
   from tbl 
), rq as(
   select *,
       case when 100 + Casescore < 0   then 0
            when 100 + Casescore > 100 then 100
            else 100 + Casescore end CumulativeScore
   from t
   where rn = 1
   
   union all 
   
   select t.Person, t.EvaluationDate, t.Casescore, t.rn,
       case when rq.CumulativeScore + t.Casescore < 0   then 0
            when rq.CumulativeScore + t.Casescore > 100 then 100
            else rq.CumulativeScore + t.Casescore end 
   from rq
   join t on t.rn = rq.rn + 1 and t.Person = rq.Person
)
select Person, EvaluationDate, Casescore, CumulativeScore
from rq
order by Person, EvaluationDate;

db<>小提琴


推荐阅读