如何避免对间隔中的重复值进行求和
Posted
技术标签:
【中文标题】如何避免对间隔中的重复值进行求和【英文标题】:How to avoid doing sum on repeating values in an interval 【发布时间】:2018-07-31 14:12:37 【问题描述】:我目前遇到了一个问题,希望您能帮助我。我需要将数据汇总为每 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
如您所见,每个代理的登录时间、未就绪时间和可用时间值会重复,因为这与代理ID 相关联。这种观点是不真实的。代理在 17:45 间隔记录了 900 秒,在 18:00 间隔再次记录了 900 秒。如果我现在总结这一点,它会给我一个 9,000 秒的结果,这对于 Logged On Time 是不正确的。 Not Ready Time 和 Available Time 也不正确。
如果我从 select 语句中删除 SkillID,我的值会正确反映
Without skills being represented
这一次,我在 17:45 和 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
【问题讨论】:
有趣的问题。你能用你的日汇总逻辑更新问题吗?两件事,前两个屏幕截图在数据方面似乎是正确的。如果您仔细观察,带有 SKILLID 列的第一个屏幕在技能 ID 级别上是唯一的一次 ID。由于您的查询中有详细信息,因此每个查询都显示相同(900 秒)。当您删除它时,它仅显示 2 条记录(如屏幕截图 2 所示)。您的一天汇总逻辑的代码将有助于了解发生了什么问题并导致 1500 秒值 嗨 Rhythem,每日汇总是通过在 select 和 group by 中进行强制转换(agi.date_time as date)来实现的。 你能分享一下数据在每日汇总中的显示方式以及技能 ID。有什么奇怪的。如果值滚动到 900,那么它们应该滚动到 1500,除非你正在做一个不同的删除一些记录 添加了 sn-p。同样,这是计算所有技能的登录时间,但实际上代理总共记录了 1800 秒。 【参考方案1】:对于 1 个呼叫座席,您可以将座席状态划分为:可用、待命、呼叫后工作(工作未就绪)、辅助(avaya 人喜欢针对不同休息类型的许多不同辅助代码)、离线、其他。
您实际上并不需要离线处理,但您必须正确区分和处理其他时间。您可以查阅 Avaya 呼叫管理系统 (Avaya CMS) 指南以获得正确的描述,但简而言之,这是座席为其他技能工作或处理直接呼叫的时候了——无论是在通话中还是在通话后工作。所以,只有一个技能可以同时拥有呼叫时间或 ACW 时间,并且这两个技能优先于可用和其他。
如果您想处理多个呼叫(聊天)处理系统,您就有麻烦了 - 这样您将一直处理相交的呼叫。您仍然可以按时间间隔划分时间,呼叫/ACW 时间优先于可用时间和辅助时间。
所有技能的基本可用时间和辅助时间应该同步,但如果不是,请根据您的判断 - 在这里按技能报告比按代理更容易。
对于提到的 Avaya CMS 有 15 分钟的汇总,我相信这是在 DB 之外完成的,然后将间隔数据存储在运行时表中,并在一天结束时将间隔数据汇总为每日数据。同样处理每周和每月的数据。
我建议您阅读 CMS 文档 - 它定义了可以使用数十年的数据库结构,因此它们几乎可以捕捉到所有细微差别。
作为旁注,在“我自己的”呼叫中心操作员控制台中,有一个操作员状态历史记录的明确表,其中包含开始-停止时间和此时间间隔的一个确定状态。因此,汇总比组合不同的相交记录要容易一些。
【讨论】:
您好 Alexander,我们没有使用 Avaya CMS。这是一个思科环境。我在这里面临的是,我们的人想要报告在代理级别汇总的技能时间。代理间隔表将提供登录时间、未准备好和所有其他代理指标但未处理呼叫以及他们感兴趣的一些其他统计信息,因此我需要加入表格。 @StephB 我不是说你应该使用它,只是看看它的数据结构。至于 CISCO,我坚信在代理端进行适当的监控,即连接到技巧的自定义 CTI 客户端并监控呼叫来自何处、代理何时接听电话等。【参考方案2】:通过以下方式修改我的代码找到了我的问题的解决方案。
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)
通过对每个间隔进行排名,我现在可以准确地报告我的登录时间、可用性时间和未就绪时间。
【讨论】:
以上是关于如何避免对间隔中的重复值进行求和的主要内容,如果未能解决你的问题,请参考以下文章
如何对一个字典中的所有键进行汇总(求和),如果一些键已经重复了不止一次。