sql-server - SQL Server 数据库中有效时间范围之间的总和分数
问题描述
我在 SQL Server 数据库中有以下示例数据。
UserID Score StartDate EndDate
------------------------------------
1 10 2019-06-01 2019-07-15
1 20 2019-06-20 2019-07-01
1 30 2019-06-17 2019-07-25
2 10 2019-05-15 2019-06-10
2 20 2019-06-15 2019-07-01
2 30 2019-06-20 2019-07-15
我需要达到以下结果。
UserID ScoreTotal StartDate EndDate
----------------------------------------
1 10 2019-06-01 2019-06-17
1 40 2019-06-17 2019-06-20
1 60 2019-06-20 2019-07-01
1 40 2019-07-01 2019-07-15
1 30 2019-07-15 2019-07-25
2 10 2019-05-15 2019-06-10
2 20 2019-06-15 2019-06-20
2 50 2019-06-20 2019-07-01
2 30 2019-07-01 2019-07-15
startdate
或的分数是否enddate
包含在每个计算中都没有关系。
任何帮助将不胜感激。
解决方案
如果我理解正确,您想按分数恒定的时段累积分数。这有点棘手,因为它可能需要因数据库而异的日期算法。这个想法是取消透视值并使用聚合和窗口函数:
with tt as (
select userid, score, startdate as dte
from t
union all
select userid, -score, enddate as dte
from t
) t
select userid, sum(sum(score)) over (partition by userid order by (dte)) as score,
dte, lead(dte) over (partition by userid order by dte)
from tt
group by userid, dte
推荐阅读
- datetime - 修复脚本以输入 2021-02-01 而不是 2021-02-32
- r - R从数据框中的句子中删除单词
- matlab - 在 Matlab 中创建 if else 语句以选择正确的矩阵
- selenium - org.openqa.grid.common.exception.GridException:在请求中找不到功能:{“capabilities”:{“browserName”:“Firefox”}}使用Selenium Grid
- c# - 使用 AddHttpClient 时如何配置其他依赖项
- javascript - 使用授权无法从带有 axios 的 API 获得响应
- c - 矩阵加法程序说明
- .net - vb.net 将数据传递给另一个类
- spring - 如何配置 Spring Boot 以仅接收 NGINX 流量
- arm - 无法建立 LAN 会话和建立 IPMI v1.5 / RMCP 会话