如何避免对间隔中的重复值求和

How to avoid doing sum on repeating values in an interval

我目前 运行 遇到一个问题,希望您能帮助我。我需要将数据汇总为每 15 分钟生成一次的每日格式。这是我首先使用的代码:

SELECT TOP 1000
agi.date_time as [Date],
AGI.AGENT_URN as AgentID,
asgi.skillgroup_urn as SkillID,
count(distinct(asgi.skillgroup_urn)) as [# of skills],
sum(asgi.CALLS_HANDLED) as [Calls Handled In],
sum(agi.LOGGED_ON_TIME)/count(DISTINCT(asgi.SKILLGROUP_URN)) as [Logged On Time (Per Agent)],
sum(agi.NOT_READY_TIME)/count(DISTINCT(asgi.SKILLGROUP_URN)) as [Not Ready Time (Per Agent)],
sum(agi.AVAIL_TIME)/count(DISTINCT(asgi.SKILLGROUP_URN)) as [Available Time (Per Agent)]

FROM AGENT_INTERVAL AGI
LEFT OUTER JOIN AGENT_SKILLGROUP_INTERVAL ASGI ON AGI.AGENT_URN = ASGI.AGENT_URN AND AGI.DATE_TIME = ASGI.DATE_TIME


WHERE 1=1
AND AGI.DATE_TIME between '2018-07-26 16:15:00 ' and '2018-07-26 16:45:59'

GROUP BY 
AGI.DATE_TIME,
AGI.AGENT_URN,
asgi.skillgroup_urn

ORDER BY 2

结果如下:

Interval data

如您所见,每个代理值的登录时间、未就绪时间和可用时间不断重复,因为这与 AgentID 相关联。这种观点并没有说实话。代理在 17:45 间隔内记录了 900 秒,在 18:00 间隔内记录了 900 秒。如果我现在总结这个,它会给我 9,000 秒的结果,这对于登录时间来说是不正确的。未就绪时间和可用时间也不正确。

如果我从 select 语句中删除 SkillID,我的值将正确反映

Without skills being represented

这一次,17:45 得到 900 秒,18:00 得到 900 秒,这是正确的。

我遇到的问题是将其回滚到一整天。

SELECT TOP 1000
cast(agi.date_time as date) as [Date],
AGI.AGENT_URN as AgentID,
asgi.skillgroup_urn as SkillID,
count(distinct(asgi.skillgroup_urn)) as [# of skills],
sum(asgi.CALLS_HANDLED) as [Calls Handled In],
sum(agi.LOGGED_ON_TIME)/count(DISTINCT(asgi.SKILLGROUP_URN)) as [Logged On Time (Per Agent)],
sum(agi.NOT_READY_TIME)/count(DISTINCT(asgi.SKILLGROUP_URN)) as [Not Ready Time (Per Agent)],
sum(agi.AVAIL_TIME)/count(DISTINCT(asgi.SKILLGROUP_URN)) as [Available Time (Per Agent)]

FROM AGENT_INTERVAL AGI
LEFT OUTER JOIN AGENT_SKILLGROUP_INTERVAL ASGI ON AGI.AGENT_URN = ASGI.AGENT_URN AND AGI.DATE_TIME = ASGI.DATE_TIME


WHERE 1=1
AND AGI.DATE_TIME between '2018-07-26 16:15:00 ' and '2018-07-26 16:45:59'

GROUP BY 
cast(AGI.DATE_TIME as date),
AGI.AGENT_URN,


ORDER BY 2

Data rolled up to the day

现在我的登录时间是 1500 秒,比实际少了 300 秒。

我该如何解决这个问题,以便当我汇总当天的数据时,我可以在报告中获得准确的登录时间、未就绪时间和可用时间?

感谢您的帮助!

Daily view per skill

对于 1 个呼叫代理,您可以将代理状态分为:可用、待命、呼叫后工作(工作未就绪)、辅助(avaya 人员喜欢针对不同中断类型使用许多不同的辅助代码)、离线,其他。

你真的不需要离线处理,但你必须区分并正确处理其他时间。您可以查阅 Avaya 呼叫管理系统 (Avaya CMS) 指南以获得正确的描述,但简而言之,这是座席为其他技能工作或处理直接呼叫的时间 - 无论是随叫随到还是随叫随到。因此,同一时刻只有一种技能可以有通话时间或ACW时间,并且这两个技能优先于可用和其他。

如果你想处理多个呼叫(聊天)处理系统,你就麻烦了——这样你将一直处理交叉呼叫。您仍然可以按间隔划分时间,call/ACW 时间优先于可用时间和辅助时间。

所有技能的基本可用时间和辅助时间应该同步,但如果不同步,则使用您的判断 - 这里的每个技能报告比每个代理更容易。

对于提到的 Avaya CMS,有 15 分钟的摘要,我相信 - 是在 DB 之外完成的,然后间隔数据存储在运行时 tables 中,并在一天结束时间隔数据汇总成日常数据。同样处理每周和每月数据。

我建议您阅读 CMS 文档 - 它定义了可以使用数十年的数据库结构,因此它们基本上抓住了所有细微差别。

附带说明一下,在 "my own" 呼叫中心操作员控制台中,有一个明确的 table 操作员状态历史记录,其中包含开始-停止时间和此间隔的一个确定状态。所以汇总比组合不同的交叉记录要容易一些。

通过按以下方式修改我的代码找到了我的问题的解决方案。

select 
AGI.*
,ROW_NUMBER() OVER (PARTITION BY DATE_TIME,AGENT_URN ORDER BY DATE_TIME) AS SEQNUM 
from AGENT_SKILLGROUP_INTERVAL AGI

)

SELECT 

CAST(AI.DATE_TIME AS DATE) [Date]
,SUM(AI.CALLS_HANDLED) AS [Calls Handled In]
,SUM(AI.HANDLED_CALLS_TALK_TIME)/nullif(sum(AI.calls_handled),0) as [Avg. Talk Time In]
,SUM(AI.INCOMING_CALLS_ON_HOLD_TIME)/nullif(sum(AI.calls_handled),0) as [Avg. Hold Time In]
,SUM(AI.HANDLED_CALLS_TIME-(AI.HANDLED_CALLS_TALK_TIME + AI.INCOMING_CALLS_ON_HOLD_TIME))/nullif(sum(AI.calls_handled),0) as [Avg. Wrap Time In]
,SUM(AI.[HANDLED_CALLS_TIME])/nullif(sum(AI.calls_handled),0) as [Avg. Handle Time In]
,SUM(CASE WHEN SEQNUM = 1 THEN AI.LOGGED_ON_TIME END) AS [Logged On Time (Per Agent)]
,SUM(ai.HANDLED_CALLS_TALK_TIME) as [Talk Time In]
,SUM(ai.HANDLED_CALLS_TALK_TIME + ai.INCOMING_CALLS_ON_HOLD_TIME) as [Phone Time In]
,SUM(ai.[INCOMING_CALLS_ON_HOLD_TIME]) as [Hold Time In]
,SUM(ai.HANDLED_CALLS_TIME-(ai.HANDLED_CALLS_TALK_TIME + ai.INCOMING_CALLS_ON_HOLD_TIME) ) AS [Wrap Time In]
,SUM(CASE WHEN SEQNUM = 1 THEN AI.NOT_READY_TIME END) as [Not Ready Time (Per Agent)]
,SUM(CASE WHEN SEQNUM = 1 THEN AI.AVAIL_TIME END) as [Available Time (Per Agent)]

FROM Agent_Interval AI


group by 
CAST(AI.DATE_TIME AS DATE)

通过给每个区间排序,我现在可以准确地报告我的 logged_on_time、avail_time 和 not_ready_time。