SUM信息但保留ResourceID(EmployeeNum)

时间:2015-05-05 12:56:43

标签: sql informix cisco

在下面的链接示例中,您将看到来自agentconnectiondetail表的来自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,调用进入并在第三个选择之前在两个代理位置响起。你看到了这一点,因为资源ID发生了变化,并且这些位置记录了10秒的响铃时间,但由于通话时间为0,因此手机未被接听。如何将振铃时间加在一起并保留接听电话的座席的资源ID号码

https://www.dropbox.com/s/9ggxb1ndxp4vid6/sample_data.xlsx?dl=0

2 个答案:

答案 0 :(得分:1)

在infomix上未经测试。我不熟悉informix,也没有测试环境。因此,我基于ANSII标准模拟了SQL,并避免使用可能特定于数据库的语法。这导致子查询,如果我更好地了解语法,则可以避免使用子查询...

这是通过SQL Fiddle

在SQL Server上工作的
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
  • 同时假设一个会话永远不会有两个具有完全相同的开始日期时间的记录;然后我们将它连接回基表A以获取接听电话的人的资源ID。这导致包含会话的内联视图, 资源,startdatetime,endDateTime,我Labeled C
  • 我们只是将其加入到聚合值中。由于这是一对一的关系,我们不必担心错误地增加总价值。因此,直接连接应该有效。

我添加了一个cntOfRes来显示该会话中涉及3个资源,并且只模拟了一些数据。

答案 1 :(得分:0)

使用子查询可能能够解决 但是根据您将要读取的数据量以及是否存在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