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