T-SQL 计算 X 期间按日期和对象分组的总计
T-SQL Calculate Total over X Period grouping by Date and Object
我有一个大数据集,对于数据集中的每一天,我需要为每一行计算前 5、7 和 10 天的聚合 activity,而不仅仅是针对当前日期,这不是直接的 运行 总总时间..而是特定时期的。
我为 activity 构建了每日聚合,但在聚合日期和对象然后为每一行计算过去的 X 间隔时遇到问题。
我正在使用 MS SQL Server 2008 R2。
例如使用 -1 天(昨天)、-2 天、-3 天
第 -1 天(上一个 Day/Yesterday)
- 对象 A 2
- 对象 B 231
- 对象 C 232
第-2天
- 对象 A 5
- 对象 B 117
- 对象 C 127
- 第-3天
- 对象 A 9
- 对象 B 200
- 对象 C 175
我的预期结果是当天 运行(但不是当前日期)
- 日期、_TID、1D、2D、3D(列)
- 日期,对象 A,2、7、16
- 日期,对象 B,231、579、779
- 日期,对象 C,232、359、534
我查看了 How to Query Totals for Last 7 Days and the better SQL SUM of Last X Records,但这是过去 X 期间和所有记录中所有 activity 的总和,并为所有行返回它,因为我需要查询聚合针对特定对象的时间段。
;WITH [stSUM] AS
(
SELECT
TX._TID
,CAST(TX.DT_Req AS DATE) as AgrGrp
,TX.DayofYr
,TX.MofY
,TX.DayofM
,TX.DayofW
,TX.TrdPayDay
,TX.Hdy_Govt
,TX.Hdy_Novel
,SUM(CASE WHEN TX.TX_BG = 'Evt' THEN 1 ELSE 0 END) as EvtCnt
,SUM(CASE WHEN TX.TX_Yes=1 THEN TX.Rqt_Amt ELSE 0 END) as Amt
FROM CRS1.dbo.JustData
Group By
CAST(TX.DT_Req AS DATE)
,TX._TID
,TX.DayofYr
,TX.MofY
,TX.DayofM
,TX.DayofW
,TX.TrdPayDay
,TX.Hdy_Govt
,TX.Hdy_Novel
)
SELECT AgrGrp, _TID,
(select sum(Amt) from (select top 7 * from stSUM bd2 where bd2.AgrGrp <= AgrGrp order by AgrGrp desc) t1 )
as Measured7,
(select sum(Amt) from (select top 5 * from stSUM bd2 where bd2.AgrGrp <= AgrGrp order by AgrGrp desc) t2 )
as Measured5
FROM [stSUM]
GROUP BY AgrGrp, _TID
ORDER BY AgrGrp
但它会产生这样的输出,这是不正确的,因为每一行应该有一个不同的值,只反映前几天该 _TID 的内容。
即Measured7回到2014-12-01,Measured5回到2014-12-03.
AgrGrp _TID Measured7 Measured5
2014-12-08 0101 14400 8620
2014-12-08 0558 14400 8620
2014-12-08 0537 14400 8620
我的方法是使用 BETWEEN 日期在子查询中总结我想要的日期范围。
;with DayInfo as
(
select cast(runtime as date) [Date],
targetType,
round(sum(duration),0) as duration
from Logs
group by cast(runtime as date),
targetType)
select di.Date,
di.targetType,
di.duration,
d2.d2DurationSum,
d7.d7DurationSum
from DayInfo di
join (select d2.Date,
d2.targetType,
sum(dd2.duration) d2DurationSum
from DayInfo d2
join DayInfo dd2
on dd2.Date between dateadd(day, -1, d2.Date) and d2.Date
and d2.targetType = dd2.targetType
group by d2.Date,
d2.targetType) as d2
on di.Date = d2.Date
and di.targetType = d2.targetType
join (select d7.Date,
d7.targetType,
sum(dd7.duration) d7DurationSum
from DayInfo d7
join DayInfo dd7
on dd7.Date between dateadd(day, -6, d7.Date) and d7.Date
and d7.targetType = dd7.targetType
group by d7.Date,
d7.targetType) as d7
on di.Date = d7.Date
and di.targetType = d7.targetType
order by 1, 2
这给出了您所描述的输出。
我有一个大数据集,对于数据集中的每一天,我需要为每一行计算前 5、7 和 10 天的聚合 activity,而不仅仅是针对当前日期,这不是直接的 运行 总总时间..而是特定时期的。
我为 activity 构建了每日聚合,但在聚合日期和对象然后为每一行计算过去的 X 间隔时遇到问题。
我正在使用 MS SQL Server 2008 R2。
例如使用 -1 天(昨天)、-2 天、-3 天
第 -1 天(上一个 Day/Yesterday)
- 对象 A 2
- 对象 B 231
- 对象 C 232
第-2天
- 对象 A 5
- 对象 B 117
- 对象 C 127
- 第-3天
- 对象 A 9
- 对象 B 200
- 对象 C 175
我的预期结果是当天 运行(但不是当前日期)
- 日期、_TID、1D、2D、3D(列)
- 日期,对象 A,2、7、16
- 日期,对象 B,231、579、779
- 日期,对象 C,232、359、534
我查看了 How to Query Totals for Last 7 Days and the better SQL SUM of Last X Records,但这是过去 X 期间和所有记录中所有 activity 的总和,并为所有行返回它,因为我需要查询聚合针对特定对象的时间段。
;WITH [stSUM] AS
(
SELECT
TX._TID
,CAST(TX.DT_Req AS DATE) as AgrGrp
,TX.DayofYr
,TX.MofY
,TX.DayofM
,TX.DayofW
,TX.TrdPayDay
,TX.Hdy_Govt
,TX.Hdy_Novel
,SUM(CASE WHEN TX.TX_BG = 'Evt' THEN 1 ELSE 0 END) as EvtCnt
,SUM(CASE WHEN TX.TX_Yes=1 THEN TX.Rqt_Amt ELSE 0 END) as Amt
FROM CRS1.dbo.JustData
Group By
CAST(TX.DT_Req AS DATE)
,TX._TID
,TX.DayofYr
,TX.MofY
,TX.DayofM
,TX.DayofW
,TX.TrdPayDay
,TX.Hdy_Govt
,TX.Hdy_Novel
)
SELECT AgrGrp, _TID,
(select sum(Amt) from (select top 7 * from stSUM bd2 where bd2.AgrGrp <= AgrGrp order by AgrGrp desc) t1 )
as Measured7,
(select sum(Amt) from (select top 5 * from stSUM bd2 where bd2.AgrGrp <= AgrGrp order by AgrGrp desc) t2 )
as Measured5
FROM [stSUM]
GROUP BY AgrGrp, _TID
ORDER BY AgrGrp
但它会产生这样的输出,这是不正确的,因为每一行应该有一个不同的值,只反映前几天该 _TID 的内容。 即Measured7回到2014-12-01,Measured5回到2014-12-03.
AgrGrp _TID Measured7 Measured5
2014-12-08 0101 14400 8620
2014-12-08 0558 14400 8620
2014-12-08 0537 14400 8620
我的方法是使用 BETWEEN 日期在子查询中总结我想要的日期范围。
;with DayInfo as
(
select cast(runtime as date) [Date],
targetType,
round(sum(duration),0) as duration
from Logs
group by cast(runtime as date),
targetType)
select di.Date,
di.targetType,
di.duration,
d2.d2DurationSum,
d7.d7DurationSum
from DayInfo di
join (select d2.Date,
d2.targetType,
sum(dd2.duration) d2DurationSum
from DayInfo d2
join DayInfo dd2
on dd2.Date between dateadd(day, -1, d2.Date) and d2.Date
and d2.targetType = dd2.targetType
group by d2.Date,
d2.targetType) as d2
on di.Date = d2.Date
and di.targetType = d2.targetType
join (select d7.Date,
d7.targetType,
sum(dd7.duration) d7DurationSum
from DayInfo d7
join DayInfo dd7
on dd7.Date between dateadd(day, -6, d7.Date) and d7.Date
and d7.targetType = dd7.targetType
group by d7.Date,
d7.targetType) as d7
on di.Date = d7.Date
and di.targetType = d7.targetType
order by 1, 2
这给出了您所描述的输出。