首页 > 解决方案 > 基于日期范围的 SQL 聚合

问题描述

我在 MSSQL 表中有以下数据。要求是将属于相同/结束时间段的用户的记录分组,并汇总 Rate 字段。

有没有办法通过即时查询来实现这一点?

Row Data
-----------------------------------------------------
RawId   Start Time      End Time        User    Rate
1       1/9/2021 14:29  1/9/2021 14:40  User-1  10
2       1/9/2021 10:37  1/9/2021 14:00  User-2  20
3       1/9/2021 14:03  1/9/2021 14:59  User-2  30
4       1/9/2021 8:51   1/9/2021 14:39  User-1  40
5       1/9/2021 14:02  1/9/2021 14:59  User-2  50

Expected Output
-----------------------------------------------------
ProID   Start Time      End Time        User    RateTotal
xx1     1/9/2021 14:29  1/9/2021 14:40  User-1  50          
xx2     1/9/2021 14:02  1/9/2021 14:59  User-2  80
xx3     1/9/2021 10:37  1/9/2021 14:00  User-2  20

商业逻辑

ProID xx1:RawID 1 & 4,属于 User-1,RawID 1 开始和结束时间 (14:29-14:40) 在 RawID 4 (08:51-14:39) 内。在这种情况下,必须将费率相加并仅显示一条记录。

ProID xx2:RawID 3 & 5,属于 User-2,RawID 3 开始和结束时间 (14:03-14:59) 在 RawID 5 (14:02-14:59) 内。在这种情况下,必须将费率相加并仅显示一条记录。

ProID xx3:RawID 2 也属于 User-2,但开始和结束时间 (10:37-14:00) 不属于其他 User-2 记录。因此,这将被视为单独的行。

标签: sqlsql-server

解决方案


with cte as

(

select Rate as Rate,dateadd(hour,datediff(HOUR,0,StartTime),0) as starttime, 
dateadd(HOUR,DATEDIFF(hour,0,endtime),0)  as EndTime 
from Row_Data

)

select sum(rate) as Rate,StartTime,Endtime from cte

group by StartTime,EndTime 

order by starttime desc

推荐阅读