SQL汇总同一天/一周内特定时间间隔的分钟总数(电话状态)

时间:2018-11-27 13:13:47

标签: sql sql-server

我很难想象如何根据电话系统代码在给定的一天之内汇总时间间隔内的分钟总数。我写了一个查询来显示全天的实际事件顺序,但是我需要总结一下时间间隔(例如,登录和注销之间的时间,处于“未就绪”状态的时间等):

SELECT -- bunch of information (aa.TimeStamp is included in this)
FROM AGENTACTIVITY as aa
JOIN EXTINFORMATION ext ON aa.AgentNum=ext.ExtNum
WHERE aa.LocalDay>20181118 and aa.LocalDay<20181126
      and aa.AgentNum in ('10', '20', '30', '40', '50')
ORDER by aa.AgentNum, aa.Time_Stamp;

系统内分配了各种活动代码:

  • 登录名= 3
  • 注销= 4
  • 就绪= 5
  • 未就绪= 6

我上面的查询返回的结果如下:

TimeStamp             AgentNum  AgentName  ActivityCode
2018-11-19 07:53:06      10      Jane           3
2018-11-19 08:14:11      10      Jane           6
2018-11-19 08:19:12      10      Jane           5
2018-11-19 11:53:08      10      Jane           4
2018-11-19 13:01:16      10      Jane           3
2018-11-19 14:53:06      10      Jane           6
2018-11-19 14:59:16      10      Jane           5
2018-11-19 15:22:22      10      Jane           6
2018-11-19 15:31:25      10      Jane           5
2018-11-19 16:53:10      10      Jane           4

因此,我知道人们何时登录和退出,还进入“未就绪”状态,然后又回到“就绪”状态。我需要摆脱的是以下内容:

  • 处于“未就绪”状态的总时间(以分钟为单位)
  • 已登录的总时间(以分钟为单位)

从这两个项目中,我可以算出总可用时间(已登录的总时间-未就绪的总时间)。

预期输出如下:

Date        AgentNum   AgentName   TotalTimeLoggedIn  TotalTimeNotReady  TotalTimeAvailable
2018-11-19     10        Jane           472                 20                 452

我希望这是明确的并且有意义。预先感谢!

2 个答案:

答案 0 :(得分:0)

Date组(看来您需要从TimeStamp列的各部分中得出),AgentNumAgentName

对于TotalTimeLoggedIn,求和一个CASE表达式,当活动为“登录”时,该时间戳与子选择结果之间的DateDiff会为该活动获取下一个(前1个)“退出”活动相同的Agent

使用“就绪”和“未就绪”活动进行类似操作以获得TotalTimeNotReady,并且您已经知道如何从这两个活动中导出TotalTimeAvailable

答案 1 :(得分:0)

  

所以这就是我所走的路,我认为这是部分解决方案。你什么   仍然需要做的是如何将您的第二个临时表更新为“推送”   值增加,所以您获得1,2或n行数,具体取决于否   的活动代码


create table #Temp_Data
(
[TimeStamp] datetime null
,AgentNum int null
,AgentName varchar(10) null
,ActivityCode int null
)
insert into #Temp_Data values
('2018-11-19 07:53:06',      10      ,'Jane',           3)
,('2018-11-19 08:14:11',      10      ,'Jane',          6)
,('2018-11-19 08:19:12',      10      ,'Jane',          5)
,('2018-11-19 11:53:08',      10      ,'Jane',           4)
,('2018-11-19 13:01:16',      10      ,'Jane',           3)
,('2018-11-19 14:53:06',      10      ,'Jane',           6)
,('2018-11-19 14:59:16',      10      ,'Jane',           5)
,('2018-11-19 15:22:22',      10      ,'Jane',           6)
,('2018-11-19 15:31:25',     10      ,'Jane',           5)
,('2018-11-19 16:53:10',      10      ,'Jane',           4)

('2018-11-19 06:53:06',      11      ,'Bob',           3)
,('2018-11-19 07:14:11',      11      ,'Bob',          6)
,('2018-11-19 08:19:12',      11      ,'Bob',          5)
,('2018-11-19 10:53:08',      11      ,'Bob',           4)
,('2018-11-19 12:01:16',      11      ,'Bob',           3)
,('2018-11-19 13:53:06',      11      ,'Bob',           6)
,('2018-11-19 14:59:16',      11      ,'Bob',           5)
,('2018-11-19 15:29:22',      11      ,'Bob',           6)
,('2018-11-19 15:31:25',     11      ,'Bob',           5)
,('2018-11-19 16:53:10',      11      ,'Bob',           4)


--drop table #Temp_Data_1
create table #Temp_Data_1
( [TimeStamp] datetime null
,AgentName varchar(10) null
,[3_] varchar(20) null
,[6_] varchar(20) null
,[5_] varchar(20) null
,[4_] varchar(20) null
)

insert into #Temp_Data_1
select *
from (
select [TimeStamp]
,AgentNum
,AgentName
,ActivityCode
--, Rank_1 = rank() over ( partition by AgentName order by [TimeStamp]  ) 
from  #Temp_Data
) as s
--where ActivityCode in ('3','6','5','4')
PIVOT
(
    Count(AgentNum)
    For ActivityCode in ([3],[6],[5],[4])
)AS pvt

update  #Temp_Data_1
set [3_] = [TimeStamp]
where [3_] = 1


update  #Temp_Data_1
set [6_] = [TimeStamp]
where [6_] = 1


update  #Temp_Data_1
set [5_] = [TimeStamp]
where [5_] = 1


update  #Temp_Data_1
set [4_] = [TimeStamp]
where [4_] = 1

select  *  from  #Temp_Data_1