sql - 范围受限的 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 |
有些帖子描述了如何进行累积和,但没有解释如何通过每个操作将其限制在一个范围内。
解决方案
正如@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;
推荐阅读
- or-tools - or-tools :如果 `num_nurses` 不等于 `num_shifts`,Python 员工调度不会给出任何解决方案
- android - 无法解决:com.android.support.cardview-v7:28.0.0:
- scala - 了解 IO 单子
- mysql - 为什么游标在过程中取空?
- wordpress - 在同一个 EC2 实例和同一个端口上托管 2 个不同的网站
- powerbi - Power BI API - 按 ID 获取数据集
- android - 反向 AppBarLayout.ScrollingViewBehavior
- r - 将 SAS Proc Shewhart 转换为 R 编程
- php - mysqli_get_client_stats 是否向 sql server 发送请求
- printing - 修改与 gwbasic 一起使用的基本文件