SUM信息但保留ResourceID(EmployeeNum)
SUM information but retain ResourceID (EmployeeNum)
在下面的链接示例中,您将从代理连接详细信息 table 中看到来自 Cisco UCCX Express 的示例电话数据。
这是我的查询 运行:
SELECT *
FROM agentconnectiondetail
WHERE startdatetime >= TO_DATE('01-01-2015 05:00','%m-%d-%Y %H:%M')
AND sessionseqnum = 0
我的问题是如何使 SessionID 的信息唯一,这是呼叫的唯一标识符,但保留接听电话的座席的员工号码?
例如,我在示例选项卡上的文档中突出显示了 sessionID 43000086306。数据显示,对于 sessionID 43000086306,呼叫进入并在两个座席位置响起,然后被第三个座席接听。你看到这个是因为 resourceID 发生了变化,并且为这些位置记录了 10 秒的响铃时间,但是由于通话时间为 0,所以 phone 没有被拾取。我如何将响铃时间加在一起并保留代理的 resourceID 号码接听电话。
https://www.dropbox.com/s/9ggxb1ndxp4vid6/sample_data.xlsx?dl=0
未经 infomix 测试。我不熟悉 informix,也没有它的测试环境。所以我根据 ANSII 标准模拟了 SQL 并避免使用可能特定于数据库的语法。这导致了子查询,如果我更好地了解语法,则可以避免这些子查询...
这是通过 SQL Fiddle
在 SQL 服务器上运行的
SELECT O.SessionID, C.ResourceID, C.StartDateTime, C.EndDateTime,
sum(O.ringTime) as TotalRingTime, sum(O.talkTime) as TotalTalkTime,
Sum(O.HoldTime) as TotalHoldTime, Sum(O.WorkTime) as TotalWorkTime,
count(Distinct O.ResourceID) as CntofRes
FROM AgentConnectionDetail O
LEFT JOIN
(
SELECT A.SessionID, A.ResourceID, A.StartDateTime, A.EndDateTime
FROM AgentConnectionDetail A
INNER JOIN (
SELECT SessionID, Max(StartDateTime) as StartDateTime
FROM AgentConnectionDetail
GROUP BY SessionID) B
on A.SessioNID = B.SessionID
and A.StartDateTime = B.StartDateTime) C
on C.SessionID=O.SessionId
GROUP BY O.SessionID, C.ResourceID, C.StartDateTime, C.EndDateTime
ORDER BY SessionID
- 假设最大 StartDateTime 将是接听电话的代理...我们从标记为内联视图的最内部查询中获取会话和日期时间
B
。
- 还假设一个会话永远不会有两条开始日期时间完全相同的记录;然后我们将它连接回基础 table
A
以获取有关谁接听电话的 resourceID。这导致包含会话的内联视图,
我 Labeled C
. 的资源、开始日期时间、结束日期时间
- 我们只是将其加入聚合值。由于这是一对一的关系,我们不必担心错误地增加总值。因此直接连接应该有效。
我添加了一个 cntOfRes 以显示该会话中涉及 3 个资源并且仅模拟了部分数据。
使用子查询或许可以解决。
但取决于您将读取的数据量以及 sesisonid 是否存在索引,性能可能会受到影响。
SELECT sessionid
, ( select resourceid from agentconnectiondetail b
where a.sessionid = b.sessionid and b.talktime > 0
) as resourceid_talktime
, sum(ringtime) as rings
FROM agentconnectiondetail a
WHERE startdatetime >= TO_DATE('01-01-2015 05:00','%m-%d-%Y %H:%M')
AND sessionseqnum = 0
group by 1,2
其他选项,如果您有正确的索引,可能会获得更好的性能。
SELECT a.sessionid
, b.resourceid
, sum(a.ringtime) as rings
FROM agentconnectiondetail a
, ( select sessionid, resourceid from agentconnectiondetail where talktime > 0
and startdatetime >= TO_DATE('01-01-2015 05:00','%m-%d-%Y %H:%M')
and sessionseqnum = 0
) as b
WHERE a.startdatetime >= TO_DATE('01-01-2015 05:00','%m-%d-%Y %H:%M')
AND a.sessionseqnum = 0
and a.sessionid = b.sessionid
group by 1,2
在下面的链接示例中,您将从代理连接详细信息 table 中看到来自 Cisco UCCX Express 的示例电话数据。
这是我的查询 运行:
SELECT *
FROM agentconnectiondetail
WHERE startdatetime >= TO_DATE('01-01-2015 05:00','%m-%d-%Y %H:%M')
AND sessionseqnum = 0
我的问题是如何使 SessionID 的信息唯一,这是呼叫的唯一标识符,但保留接听电话的座席的员工号码?
例如,我在示例选项卡上的文档中突出显示了 sessionID 43000086306。数据显示,对于 sessionID 43000086306,呼叫进入并在两个座席位置响起,然后被第三个座席接听。你看到这个是因为 resourceID 发生了变化,并且为这些位置记录了 10 秒的响铃时间,但是由于通话时间为 0,所以 phone 没有被拾取。我如何将响铃时间加在一起并保留代理的 resourceID 号码接听电话。
https://www.dropbox.com/s/9ggxb1ndxp4vid6/sample_data.xlsx?dl=0
未经 infomix 测试。我不熟悉 informix,也没有它的测试环境。所以我根据 ANSII 标准模拟了 SQL 并避免使用可能特定于数据库的语法。这导致了子查询,如果我更好地了解语法,则可以避免这些子查询...
这是通过 SQL Fiddle
在 SQL 服务器上运行的SELECT O.SessionID, C.ResourceID, C.StartDateTime, C.EndDateTime,
sum(O.ringTime) as TotalRingTime, sum(O.talkTime) as TotalTalkTime,
Sum(O.HoldTime) as TotalHoldTime, Sum(O.WorkTime) as TotalWorkTime,
count(Distinct O.ResourceID) as CntofRes
FROM AgentConnectionDetail O
LEFT JOIN
(
SELECT A.SessionID, A.ResourceID, A.StartDateTime, A.EndDateTime
FROM AgentConnectionDetail A
INNER JOIN (
SELECT SessionID, Max(StartDateTime) as StartDateTime
FROM AgentConnectionDetail
GROUP BY SessionID) B
on A.SessioNID = B.SessionID
and A.StartDateTime = B.StartDateTime) C
on C.SessionID=O.SessionId
GROUP BY O.SessionID, C.ResourceID, C.StartDateTime, C.EndDateTime
ORDER BY SessionID
- 假设最大 StartDateTime 将是接听电话的代理...我们从标记为内联视图的最内部查询中获取会话和日期时间
B
。 - 还假设一个会话永远不会有两条开始日期时间完全相同的记录;然后我们将它连接回基础 table
A
以获取有关谁接听电话的 resourceID。这导致包含会话的内联视图, 我Labeled C
. 的资源、开始日期时间、结束日期时间
- 我们只是将其加入聚合值。由于这是一对一的关系,我们不必担心错误地增加总值。因此直接连接应该有效。
我添加了一个 cntOfRes 以显示该会话中涉及 3 个资源并且仅模拟了部分数据。
使用子查询或许可以解决。
但取决于您将读取的数据量以及 sesisonid 是否存在索引,性能可能会受到影响。
SELECT sessionid
, ( select resourceid from agentconnectiondetail b
where a.sessionid = b.sessionid and b.talktime > 0
) as resourceid_talktime
, sum(ringtime) as rings
FROM agentconnectiondetail a
WHERE startdatetime >= TO_DATE('01-01-2015 05:00','%m-%d-%Y %H:%M')
AND sessionseqnum = 0
group by 1,2
其他选项,如果您有正确的索引,可能会获得更好的性能。
SELECT a.sessionid
, b.resourceid
, sum(a.ringtime) as rings
FROM agentconnectiondetail a
, ( select sessionid, resourceid from agentconnectiondetail where talktime > 0
and startdatetime >= TO_DATE('01-01-2015 05:00','%m-%d-%Y %H:%M')
and sessionseqnum = 0
) as b
WHERE a.startdatetime >= TO_DATE('01-01-2015 05:00','%m-%d-%Y %H:%M')
AND a.sessionseqnum = 0
and a.sessionid = b.sessionid
group by 1,2