2015-05-05 1 views
1

В приведенном ниже примере вы увидите примеры данных телефонии Cisco UCCX Express из таблицы соединений agentconnection.SUM информация, но сохранить ResourceID (EmployeeNum)

Это запрос, я бегу:

SELECT * 
FROM agentconnectiondetail 
WHERE startdatetime >= TO_DATE('01-01-2015 05:00','%m-%d-%Y %H:%M') 
    AND sessionseqnum = 0 

Мой вопрос, как я могу сделать информацию, уникальную для SessionID, который является уникальным идентификатором для вызова, но сохранить Employeenumber агента, который ответил на вызов?

Например, я выделил в документе на вкладке образца идентификатор сессии 43000086306. Данные показывают, что для sessionID 43000086306 вызов пришел и зашел в две позиции агента, прежде чем он был поднят третьим. Вы видите это, потому что изменяется идентификатор resourceID и 10 секунд времени звонка регистрируются для этих позиций, но телефон не был поднят, так как время разговора равно 0. Как я могу суммировать время цикла вместе и сохранить номер ресурса для агента, который взял вызов ,

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

+0

Какие столбцы действительно нужны для вывода. Поскольку сложность ответа зависит от желаемого результата. И что такое резервная СУБД? SQL Server? Oracle? MySql? – xQbert

+0

Спасибо, что ответили. Необходимыми столбцами были бы sessionid (уникальные без обмана), ресурс, startdatetime, enddatetime, время вызова, время разговора, время ожидания, время работы. RMDBS - это Informix. – rynsmns

ответ

1

Непроверено на INFOMIX. Я не знаком с informix, и у меня нет тестовой среды для него. Поэтому я издевался над SQL на основе стандартов ANSII и избегал использования синтаксиса, который может быть специфичным для базы данных. Это привело к подзапросов, которые могут быть в состоянии избежать, если бы я знал, что синтаксис лучше ...

Вот он работает на SQL Server хотя SQL Fiddle

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.
  • Также предполагается, что сеанс никогда не будет иметь двух записей с тем же самым началом datetime; мы затем присоединяем его к базовой таблице A, чтобы получить идентификатор resourceID, который ответил на вызов. Это приводит к встроенному представлению, содержащему сеанс, ресурс , startdatetime, endDateTime, который у меня есть Labeled C.
  • Мы просто присоединяем это к совокупным значениям. Поскольку это взаимно-однозначное отношение, нам не нужно беспокоиться о ложном увеличении общих значений. таким образом, прямое соединение должно работать.

Я добавил cntOfRes, чтобы показать, что в этот сеанс участвовали 3 ресурса и только издевались над некоторыми данными.

+0

Этого достаточно, чтобы мои мозговые соки текли снова. TY! – rynsmns

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  

 Смежные вопросы

  • Нет связанных вопросов^_^