powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / запрос на пересекающееся время
26 сообщений из 26, показаны все 2 страниц
запрос на пересекающееся время
    #33279808
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть БД с телефонными звонками, формат вкратце такой:
Код: plaintext
1.
Время_окончания_звонка |  продолжительность_звонка | откуда | 
куда
Надо посчитать максимальное количество одновременных звонков.... Формат
колонок где время и продолжительность - time

Я могу посчитать время начала звонка - это разница между концом и
продолжительностью.... - я получу период - со скольки до скольки был звонок.
А вот как потом найти пересечения....

Щас подумываю над вариантом тупого перебора (7000 записей - не так много).
Но это же неправильно....

MySQL4.0 - но это тестовая машина .можно 4.1 или 5 накатить, если надо
будет.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33279989
Gerros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нужна просто идея\алгоритм, то на MS SQL будет примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
set nocount on
create table Dzzz
( date1 datetime, --момент начала звонка
  date2 datetime  --момент окончания звонка
)
--drop table Dzzz
declare @i int
set @i =  10 
while @i >  0  begin
  insert Dzzz(date1) values( dateadd(ss, convert(int, rand() *  240 ), '20050920'))
  set  @i = @i- 1 
end
--select * from Dzzz
--delete from Dzzz
update Dzzz set date2 = dateadd(ss, convert(int, rand() *  240 ), date1)

--перечень всех моментов начала и окончания звонков и звонки,
--которые происходили в эти моменты
select T.TS, Dzzz.date1, Dzzz.date2
from
  (select distinct date1 as TS from Dzzz
   union
   select distinct date2 from Dzzz
  ) as T
  join Dzzz on Dzzz.date1 <= T.TS and T.TS < Dzzz.date2
order by TS

--статистика нагрузки во времени
select T.TS, count( 1 )
from
  (select distinct date1 as TS from Dzzz
   union
   select distinct date2 from Dzzz
  ) as T
  join Dzzz on Dzzz.date1 <= T.TS and T.TS < Dzzz.date2
group by T.TS
order by TS
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33279999
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ничерта я непонял из вышеприведённого....
Это на просто прихоть - щас собираемся менять провайдера, за этим я и собрал статиттику по звонкам из АТС, затем в БД и загнал. По часам суток, по числу звонков - куда сколько во сколько по сколько я проанализировал. А вот максимальное число одновременных звонков по IP телефонии никак не могу вытащить - а это надо знать чтобы сказать начальству - сколько нам линий надо подключать :( Я знаю примерно - 2 и больше. Но я могу ошибаться....
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33280008
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дай SHOW CREATE TABLE соответствующей таблицы.
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33280130
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по моему проще написать скажем на перле небольшую програмку, засосать в память всю базу (типа временную таблицу с engine=memory) и сделать цикл по секундам и в каждую секунду смотреть count(*) где from_unixtime(значение) between дата_начала_звонка and дата_завершения_звонка
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33280261
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE `2005_call` (
  `call_unic_id` int( 16 ) NOT NULL auto_increment,
  `call_date` date NOT NULL default '0000-00-00',
  `call_time` time NOT NULL default '00:00:00',
  `int_number` varchar( 4 ) NOT NULL default '',
  `ext_line` char( 3 ) NOT NULL default '',
  `provider` enum('CORBINA','MULTIKOM','NONE') NOT NULL default 'CORBINA',
  `call_number` varchar( 32 ) NOT NULL default '',
  `call_duration` time NOT NULL default '00:00:00',
  `sostoyanie` varchar( 16 ) NOT NULL default '',
  PRIMARY KEY  (`call_unic_id`)
) TYPE=MyISAM COMMENT='Временная таблица для хранения звонков' 

2 Хрен - сам с такой мыслью сижу. но там статистика за месяц - как бы у него
неделя не ушла на перебор тупой посекундно :)


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33280269
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверно пояснить надо:
call_unic_id - ничего не значащая графа, только для привязки точной
call_date - число когда было окончание звонка
call_time - время окончания звонка
int_number - внутренний номер абонента
ext_line - номер внешней линии
provider - провайдер через которого звонок был (по этому поводу я и
развивиал дискуссию в форуме по линуху :)), CORBINA - просто звонок по
городу, или через обычную "восьмёрку", MULTIKOM - та самая IP телефония
которую и надо посчитать одновременно, NONE - звонок входящий
call_duration - продолжительность разговора
sostoyanie - всякая техническая лабуда, типа был ли трансфер для звонка и
прочее.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33280608
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT DISTINCT t1.call_unic_id, COUNT(t2.call_unic_id) AS num_calls 
FROM `2005_call` AS t1, `2005_call` AS t2 
WHERE
UNIX_TIMESTAMP(t1.`call_date`)+TIME_TO_SEC(t1.`call_time`)-TIME_TO_SEC(t1.`call_duration`)<=UNIX_TIMESTAMP(t2.`call_date`)+TIME_TO_SEC(t2.`call_time`) 
AND
UNIX_TIMESTAMP(t1.`call_date`)+TIME_TO_SEC(t1.`call_time`)>=UNIX_TIMESTAMP(t2.`call_date`)+TIME_TO_SEC(t2.`call_time`)-TIME_TO_SEC(t2.`call_duration`) 
GROUP BY t1.call_unic_id ORDER BY num_calls DESC LIMIT  1 ;
Засыпаю уже, но вроде так. Индексы для скорости и доп. условия расставить по вкусу)
Идея простая (для того, чтобы отрезки пересекались нужно чтобы начало первого было не больше конца второго и конец первого был не меньше начала второго), но за преобразованием даты в удобный мне формат теряется.
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33280617
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, врёт мой запрос(
Если кто-то висел на телефоне час, и за это время 50 раз по 1 минуте звонили -- он выдаст 51 параллельный звонок(
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33280849
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неважно. Запустил уже. 20 минут уже шуршит. Жду результатов :)


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33280952
Фотография 4m@t!c
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторневажно. Запустил уже. 20 минут уже шуршит. Жду результатов :) гы-гы. А смысл?
----------------------------------------
Артисты не приехали, приехали цыгане
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33281005
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
после 10 минут ожидания - стало принципиально интересно что он выведет. Я в
конце лимит 15 сделал... Тоже из интерресу :)
А пока думаю и вникаю.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33281012
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще - у меня самые сложные запросы по 2-х милионной БД занимали 3-5
секунд.... А тут 7 тыщщ и столько времени :)
Да и давно хотел на серваке какой-нить cpuburn запустить - а тут такая
возможность :) Да и результат хоть какой-то будет :)


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33281072
Ekshibarov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select max(call_count) 
from (select call_time,call_duration,(select count(*) from 2005_call as b where 
(UNIX_TIMESTAMP(a.call_date) + TIME_TO_SEC(a.call_time) - TIME_TO_SEC(a.call_duration) >= 
UNIX_TIMESTAMP(b.call_date) + TIME_TO_SEC(b.call_time) - TIME_TO_SEC(b.call_duration) 
and UNIX_TIMESTAMP(a.call_date) + TIME_TO_SEC(a.call_time) <= UNIX_TIMESTAMP(b.call_date) + 
TIME_TO_SEC(b.call_time)) 
or (UNIX_TIMESTAMP(a.call_date) + TIME_TO_SEC(a.call_time) - TIME_TO_SEC(a.call_duration) < 
UNIX_TIMESTAMP(b.call_date) + TIME_TO_SEC(b.call_time) - TIME_TO_SEC(b.call_duration) 
and UNIX_TIMESTAMP(a.call_date) + TIME_TO_SEC(a.call_time) < UNIX_TIMESTAMP(b.call_date) + 
TIME_TO_SEC(b.call_time) 
and UNIX_TIMESTAMP(a.call_date) + TIME_TO_SEC(a.call_time) > UNIX_TIMESTAMP(b.call_date) + 
TIME_TO_SEC(b.call_time) - TIME_TO_SEC(b.call_duration))) 
as call_count from 2005_call as a) 
as c;
Смысл в следующем, для каждого интервала берем количество пересекающихся с ним, и из них
выбираем максимальное, но что бы не получилось как у DocAl, берем только те которые пересекают
его одним из двух способов:
Код: plaintext
                                                      1 Способ                                 2 Способ   
Код: plaintext
Текущий интервал                                     (   )                                          (          )          
Код: plaintext
Перебираемы интервалы                       (           )                                           (              ) 
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33281158
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 DocAl
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
+--------------+-----------+
| call_unic_id | num_calls |
+--------------+-----------+
|          8071  |        169  |
|          8097  |        123  |
|          1549  |         83  |
|          7147  |         83  |
|          4904  |         80  |
|          5289  |         78  |
|          3852  |         65  |
|          7590  |         62  |
|           518  |         62  |
|          4370  |         57  |
|          5607  |         56  |
|          6479  |         55  |
|          2199  |         55  |
|          4378  |         55  |
|          2129  |         54  |
+--------------+-----------+
щас другой вариант пробую :)
(тока вот 4.1 MySQL соберётся...)


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33281235
Gerros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lissyaraничерта я непонял из вышеприведённого....
Идея такая: количество звонков в любой момент времени может измениться только в тот момент, когда какой-то звонок начинается или заканчивается.
Строим таблицу "контрольных точек" - совокупность всех моментов времёни в которые начинались или заканчивались звонки.
Для 7000 звонков будет 14000 строк (по две для каждого звонка).
Потом объединяем эту таблицу с таблицей звонков по принципу "контрольная точка" больше времени начала звонка и меньше времени окончания звонка.
Если теперь в таком объединении посчитать количество строк для каждой контрольной точки, то получим количество звонков, происходящих в момент времени, соответствующий "контрольной точке".

Извини, если что не так - трудно объяснить, но работает.
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33282466
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ekshibarov Vladimir
Смысл в следующем, для каждого интервала берем количество пересекающихся с ним, и из них
выбираем максимальное, но что бы не получилось как у DocAl, берем только те которые пересекают
его одним из двух способов:
Код: plaintext
                                                      1 Способ                                 2 Способ   
Код: plaintext
Текущий интервал                                     (   )                                          (          )          
Код: plaintext
Перебираемы интервалы                       (           )                                           (              ) 

Гм. Вот не понял, а в чём смысл выбирать именно такое пересечение?
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33282471
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Долго пока не думал, но симптоматическое лечение для моего запроса -- добавить в условие что t1.`call_duration`<=t2.`call_duration`. На первый взгляд, все пересечения останутся, но считаться общая часть будет не по длинному звонку. Хотя, пожалуй, лишь не по самому длинному... Но попробуй, тебе ж краш-тест для сервера нужен был)
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33282503
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он досчитал на работе. Я по загрузке ЦП вижу. А результат увижу только завтра....
Кстати даже с последним дополнением твой запрос выдаёт слишком большое число - 7. Получается у нас все линии заняты в этот момент. Неверю.... Я прогнозирую 3-4... Ну 5 - максимум вообще. Но не 7....
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33282512
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПО идее, при указанном уточнении условия запрос считает пересечения с самым коротким из параллельных звонков. Так вот сразу не вижу, где он может обсчитаться...
А насчёт верю-не верю -- запрос же выдаёт id звонка, для которого он это насчитал, посмотри)
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33282656
Ekshibarov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DocAlДолго пока не думал, но симптоматическое лечение для моего запроса -- добавить в условие что t1.`call_duration`<=t2.`call_duration`. На первый взгляд, все пересечения останутся, но считаться общая часть будет не по длинному звонку. Хотя, пожалуй, лишь не по самому длинному... Но попробуй, тебе ж краш-тест для сервера нужен был)

У тебя для пересечения вида:
Код: plaintext
1.
2.
3.
 Текущий интервал              (       )
 [code=plaintext] Перебираемые           (           ) (                   )
Для текущего интервала количество одновременных звонков будет равно 3, что неверно.
                    
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33282693
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, согласен...
Ок, если так, то можно добавить в таблицу 2592000 записей фейковых звонков длительностью в одну секунду на каждую секунду месяца, тогда всё пересечётся как надо, но боюсь, выйдет быстрее все звонки отрисовать на миллиметровке и подсчитать вручную) Причём быстрее на порядки)
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33282745
Ekshibarov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мой запрос должен работать, он отбрасывает пересечения вида
Код: plaintext
                  (                                 )                                   (             )
Код: plaintext
                     ( )    ( )   (  )   ( )                                 (           )      (              )
но я не могу найти примера на котором он бы не нашел максимально значение одновременных звонков
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33282809
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё. Всем спасибо. Итого получилось 4.
Теперь буду сидеть и вникать в те запросы что были, и в то о чём тут шла
беседа в 4-х последних сообщениях....
Абстракционизьм какой-то рисовали :)


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33282826
Ekshibarov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Каким запросом получилось то?
...
Рейтинг: 0 / 0
запрос на пересекающееся время
    #33282901
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
твоим :)


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / запрос на пересекающееся время
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]