Одновременные звонки с CDR - PullRequest
1 голос
/ 09 сентября 2008

Мне нужно провести анализ одновременных событий, когда есть только время начала и продолжительность каждого события.

Детали

У меня есть стандартная запись о вызове CDR, которая содержит, среди прочего:

  • calldate (время начала каждого звонка
  • длительность (int, секунды длительности звонка)
  • канал (строка)

Что мне нужно придумать, так это какой-то анализ одновременных вызовов на каждую секунду в течение заданного периода времени. Например, график одновременных звонков у нас был вчера.

(проблема та же, если у нас есть журналы посетителей с продолжительностью на веб-сайте и мы хотим получить одновременных клиентов для группы веб-страниц)

Каким будет ваш алгоритм?

Я могу перебирать записи за заданный период и заполнять массив, где каждый сегмент массива соответствует 1 секунде в общем периоде. Это работает и кажется быстрым, но если период времени велик (скажем, 1 год), мне потребуется много памяти (3600x24x365x4 байта ~ 120MB приблизительно).

Это для интерактивного веб-приложения, поэтому мой объем памяти должен быть достаточно маленьким.

Редактировать

Под одновременным я подразумеваю все вызовы в данную секунду. Второй будет мой минимальный блок. Я не могу использовать что-то большее (например, час), потому что все звонки в течение часа не нужно удерживать одновременно.

Ответы [ 4 ]

1 голос
/ 09 сентября 2008

Я бы реализовал это в базе данных. Используя предложение GROUP BY с DATEPART, вы можете получить список одновременных вызовов за любой желаемый период времени, по секундам, минутам, часам и т. Д.

На веб-странице вам потребуется отображать только гистограмму, возвращаемую запросом.

0 голосов
/ 04 октября 2008

Вы можете создать таблицу 'simultaneous_calls' с 3 полями:

yyyymmdd  Char(8),
day_second Number,  -- second of the day,
count          Number   -- count of simultaneous calls
Ваш веб-сервис может взять значение 'count' из этой таблицы и сделать некоторую статистику.

Таблица одновременных вызовов будет заполнена какой-то пакетной программой, которая будет запускаться каждый день после окончания дня.

При условии, что вы используете Oracle, пакет может запустить процедуру PL / SQL, которая выполняет следующие действия:

  1. Добавляет таблицу с 24 * 3600 = 86400 записей для каждой секунды дня со значением по умолчанию 'count' = 0.
  2. Определяет курсор 'day_cdrs' для запроса:
<code>
Select to_char(calldate, 'yyyymmdd')              yyyymmdd,
         (calldate - trunc(calldate)) * 24 * 3600   starting_second,
         duration                                              duration
From cdrs
Where cdrs.calldate >= Trunc(Sysdate -1)
    And cdrs.calldate 
  1. Перебирает курсор для увеличения поля 'count' на секунды вызова:
For cdr in day_cdrs
Loop 
   Update simultaneos_calls
   Set      count = count + 1
   Where yyyymmdd = cdr.yyyymmdd
       And day_second Between cdr.starting_second And cdr.starting_second + cdr.duration;
End Loop;
</code>
0 голосов
/ 04 октября 2008

Вы можете использовать статическую таблицу Numbers для множества подобных трюков SQL. Таблица чисел просто содержит целые числа от 0 до n для n, например, 10000.

Тогда вам не нужно создавать временную таблицу, а вместо этого это подзапрос, подобный:

SELECT StartTime + Numbers.Number AS Second
FROM Numbers
0 голосов
/ 10 сентября 2008

@ eric-z-beard: Мне бы очень хотелось реализовать это в базе данных. Мне нравится ваше предложение, и, хотя оно, кажется, ведет к чему-то, я не совсем понимаю его. Не могли бы вы уточнить? Пожалуйста, помните, что каждый звонок будет длиться несколько секунд, и каждую секунду нужно считать. Если используется DATEPART (или что-то подобное в MySQL), какую секунду следует использовать для GROUP BY. Смотрите примечание по одновременности.

Разрабатывая это, я нашел способ решить эту проблему, используя временную таблицу. Предполагая, что temp держит все секунды от tStart до tEnd, я мог бы сделать

SELECT temp.second, count(call.id)
FROM call, temp
WHERE temp.second between (call.start and call.start + call.duration)
GROUP BY temp.second

Затем, как и предполагалось, веб-приложение должно использовать это как гистограмму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...