Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
помогите с запросом
|
|||
|---|---|---|---|
|
#18+
попалась коварная задачка есть таблица: Код: plaintext 1. 2. 3. 4. 5. connect_time - начало звонка disconnect_time - разрыв соединения duration - длительность в секундах необходимо определить максимальное количество одновременных звонков в сутки. количество записей в сутки - около 20000. простая пробежка курсором по таблице и поиск пересекающихся интервалов выполняется очень долго. пробовал каким-то образом прикрутить к решению дополнительную таблицу, в которой 86400 записей - количество секунд в сутках, но до конца не придумал как мне с ней обращаться - идея была в том, чтобы найти с помощью этой доп.таблицы количество одновременных сессий для каждой записи, а потом из этого множества выбрать max. Очень хочется решить эту задачу одним запросом, пусть с вложенными и минимизировать время вычисления. Все идеи приветствуются. спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 15:58 |
|
||
|
помогите с запросом
|
|||
|---|---|---|---|
|
#18+
кстати, нужно ли это поле duration integer ? оно производно и зависит от начала и конца вроде и нету смысла хранить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 16:20 |
|
||
|
помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Какие индексы созданы над таблицей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 16:24 |
|
||
|
помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Winnipuhкстати, нужно ли это поле duration integer ? оно производно и зависит от начала и конца вроде и нету смысла хранить хранить его нужно, но привел я его напрасно - согласен в вычислениях это поле использовать нельзя и не нужно, потому что например duration может быть 0, а disconnect_time - connect_time > 0, например трубку если не берут или разрыв в результате ошибки какой-ниудь случился и получается нулевая длительность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 16:25 |
|
||
|
помогите с запросом
|
|||
|---|---|---|---|
|
#18+
AndreyVoпростая пробежка курсором по таблице и поиск пересекающихся интервалов выполняется очень долгокак это делали? пробежаться в pl-pgsql в цикле по результатам нижеприведенного запроса изменяя значение счетчика $CNT++ или $CNT-- в засисимости от type, и запоминая $MAX=$CNT if $MAX<$CNT. select * from ( select 'start' as type, connect_time as time from calls union all select 'stop' as type, disconnect_time as time from calls ) order by time ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 16:28 |
|
||
|
помогите с запросом
|
|||
|---|---|---|---|
|
#18+
ilejnКакие индексы созданы над таблицей? отдельные индексы B-Tree на connect_time и disconnect_time. Если необходимо создать другие - составные может быть - подскажите - обсуждаются любые решения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 16:30 |
|
||
|
помогите с запросом
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat[quot AndreyVo]простая пробежка курсором по таблице и поиск пересекающихся интервалов выполняется очень долгокак это делали? некрасиво делал - для каждой строки считал в подзапросе count пересечений интервалов, сам запрос уже не существует в природе -воспроизводить это чудовище не хочется, чтобы здесь привести. Код: plaintext 1. ваше решение мне нравится - спасибо за помощь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 17:21 |
|
||
|
помогите с запросом
|
|||
|---|---|---|---|
|
#18+
насколько я понял - одна строка в этой таблице - это один _отдельный_ целиковый звонок ? и насколько я понял, два звонка считаются одновременными если время начала или конца первого звонка попадает в промежуток времени второго ? тогда если без цикла - одним запросом, то имхо можно вот как-то так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. 7. -- „Истина — это вовсе не то, что можно убедительно доказать, это то, что делает всё проще и понятнее“ — Антуан де Сент-Экзюпери ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 17:46 |
|
||
|
помогите с запросом
|
|||
|---|---|---|---|
|
#18+
взять максимум от Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 18:00 |
|
||
|
помогите с запросом
|
|||
|---|---|---|---|
|
#18+
Ёш токо достаточно отсекать по началу (то что попадает в промежуток можно не считать - они считаются в сумме другой строки - по началу попавшего в промежуток). - т.е. реперы "начало" - это та самая опорная табличка , вместо "86400 записей - количество секунд в сутках", в которые считаются одновременные звонки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 18:05 |
|
||
|
помогите с запросом
|
|||
|---|---|---|---|
|
#18+
У меня под рукой нет PostgreSQL, но не думаю, чтобы я сделал слишком много глупостей в этом запросе select max(counter) from (select t1.oid,count(*) as counter from calls as t1, calls as t2 where t1.oid <> t2.oid and t1.connect_time<=t2.connect_time and t1.disconnect_time>=t2.disconnect_time group by t1.oid) Индекс над таблицей д.б. только один - первое поле connect_time, второе disconnect_time. В результате у нас будет seq_scan, а для каждого элемента еще один поиск по диапазону. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 18:12 |
|
||
|
помогите с запросом
|
|||
|---|---|---|---|
|
#18+
ilejnне думаю, чтобы я сделал слишком много глупостей в этом запросе Сделал-таки. Запрос будет врать на единицу, т.е. ее нужно прибавлять к полученному результату. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 18:15 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=284&tid=2004947]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
18ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 318ms |

| 0 / 0 |
