【发布时间】:2012-11-18 21:05:42
【问题描述】:
T-SQL、SQL Server 2008 及更高版本
给定一个样本表
StatusSetDateTime | UserID | Status | StatusEndDateTime | StatusDuration(in seconds)
============================================================================
2012-01-01 12:00:00 | myID | Available | 2012-01-01 13:00:00 | 3600
我需要将其分解为使用 15 分钟间隔的视图,例如:
IntervalStart | UserID | Status | Duration
===========================================
2012-01-01 12:00:00 | myID | Available | 900
2012-01-01 12:15:00 | myID | Available | 900
2012-01-01 12:30:00 | myID | Available | 900
2012-01-01 12:45:00 | myID | Available | 900
2012-01-01 13:00:00 | myID | Available | 0
etc....
现在我已经能够四处搜索并找到一些会崩溃的查询 我为 MySql Here 找到了类似的东西:
还有一些用于 T-SQL 的东西Here
但在第二个示例中,他们将结果相加,而我需要将总持续时间除以间隔时间(900 秒)除以用户除以状态。
我能够调整第二个链接中的示例以将所有内容拆分为间隔,但返回总持续时间,我无法完全弄清楚如何拆分间隔持续时间(并且仍然总计为原始总持续时间)。
提前感谢您提供任何见解!
编辑:第一次尝试
;with cte as
(select MIN(StatusDateTime) as MinDate
, MAX(StatusDateTime) as MaxDate
, convert(varchar(14),StatusDateTime, 120) as StartDate
, DATEPART(minute, StatusDateTime) /15 as GroupID
, UserID
, StatusKey
, avg(StateDuration) as AvgAmount
from AgentActivityLog
group by convert(varchar(14),StatusDateTime, 120)
, DATEPART(minute, StatusDateTime) /15
, Userid,StatusKey)
select dateadd(minute, 15*GroupID, CONVERT(datetime,StartDate+'00'))
as [Start Date]
, UserID, StatusKey, AvgAmount as [Average Amount]
from cte
编辑:第二次尝试
;With cte As
(Select DateAdd(minute
, 15 * (DateDiff(minute, '20000101', StatusDateTime) / 15)
, '20000101') As StatusDateTime
, userid, statuskey, StateDuration
From AgentActivityLog)
Select StatusDateTime, userid,statuskey,Avg(StateDuration)
From cte
Group By StatusDateTime,userid,statuskey;
【问题讨论】:
-
在您的示例中,您已拆分为 5 行和 5 * 900 != 3600 还是我遗漏了什么?
-
您的第一个间隔总是从 StatusSetDateTime 开始,还是总是基于 :00, :15, :30, :45?使用您的示例,如果 StatusSetDateTime 为 12:06:30,您的第一个时间间隔是从 12;00:00 还是 12:06:30 开始?另外,您可以发布您目前用于拆分的 SQL 吗?
-
@FarukSahin 抱歉,我的意思是在最后的间隔中输入 0,感谢您理解。间隔将始终为 00、15、30、45
-
就个人而言,
StatusEndDateTime(真的吗?)是独家 - 你在13:00拥有的状态是不是Available,这是什么其他(未知,或可能没有)。毕竟,它会建议您再有 15 分钟的空闲时间,但实际上可能并非如此。 -
抱歉,如果我重复一遍,不清楚:StatusSetDatetime 总是 是否会以 :00、:15、:30 或 :45 结尾?没有任何秒部分?而且,您确定要包含一个持续时间为 0 的最后一行吗?持续时间为 0 的行实际上具有什么价值或业务意义?
标签: sql sql-server sql-server-2008 tsql group-by