Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / запрос на пересекающееся время / 25 сообщений из 26, страница 1 из 2
20.09.2005, 18:30:38
    #33279808
lissyara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на пересекающееся время
Есть БД с телефонными звонками, формат вкратце такой:
Код: plaintext
1.
Время_окончания_звонка |  продолжительность_звонка | откуда | 
куда
Надо посчитать максимальное количество одновременных звонков.... Формат
колонок где время и продолжительность - time

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

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

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


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
20.09.2005, 21:37:02
    #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
20.09.2005, 21:56:08
    #33279999
lissyara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на пересекающееся время
ничерта я непонял из вышеприведённого....
Это на просто прихоть - щас собираемся менять провайдера, за этим я и собрал статиттику по звонкам из АТС, затем в БД и загнал. По часам суток, по числу звонков - куда сколько во сколько по сколько я проанализировал. А вот максимальное число одновременных звонков по IP телефонии никак не могу вытащить - а это надо знать чтобы сказать начальству - сколько нам линий надо подключать :( Я знаю примерно - 2 и больше. Но я могу ошибаться....
...
Рейтинг: 0 / 0
20.09.2005, 22:14:06
    #33280008
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на пересекающееся время
Дай SHOW CREATE TABLE соответствующей таблицы.
...
Рейтинг: 0 / 0
21.09.2005, 03:29:44
    #33280130
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на пересекающееся время
по моему проще написать скажем на перле небольшую програмку, засосать в память всю базу (типа временную таблицу с engine=memory) и сделать цикл по секундам и в каждую секунду смотреть count(*) где from_unixtime(значение) between дата_начала_звонка and дата_завершения_звонка
...
Рейтинг: 0 / 0
21.09.2005, 08:54:16
    #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
21.09.2005, 09:00:09
    #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
21.09.2005, 11:04:54
    #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
21.09.2005, 11:07:15
    #33280617
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на пересекающееся время
Хотя нет, врёт мой запрос(
Если кто-то висел на телефоне час, и за это время 50 раз по 1 минуте звонили -- он выдаст 51 параллельный звонок(
...
Рейтинг: 0 / 0
21.09.2005, 12:10:31
    #33280849
lissyara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на пересекающееся время
неважно. Запустил уже. 20 минут уже шуршит. Жду результатов :)


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


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


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
21.09.2005, 13:18:35
    #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
21.09.2005, 13:42:07
    #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
21.09.2005, 14:01:37
    #33281235
Gerros
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на пересекающееся время
lissyaraничерта я непонял из вышеприведённого....
Идея такая: количество звонков в любой момент времени может измениться только в тот момент, когда какой-то звонок начинается или заканчивается.
Строим таблицу "контрольных точек" - совокупность всех моментов времёни в которые начинались или заканчивались звонки.
Для 7000 звонков будет 14000 строк (по две для каждого звонка).
Потом объединяем эту таблицу с таблицей звонков по принципу "контрольная точка" больше времени начала звонка и меньше времени окончания звонка.
Если теперь в таком объединении посчитать количество строк для каждой контрольной точки, то получим количество звонков, происходящих в момент времени, соответствующий "контрольной точке".

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

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

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


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
22.09.2005, 09:29:00
    #33282826
Ekshibarov Vladimir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на пересекающееся время
Каким запросом получилось то?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / запрос на пересекающееся время / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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