Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Преобразовать диапазоны РосСвязи в заданный вид  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
Есть задача преобразовать диапазоны номеров взятых с сайта РосСвязи. Ранее решал похожую, но условия были проще, нужно было определить лучшую цену предлагаемую провайдерами по разным направлениям и вывести диапазоны. Для примера имеем тарифные сетки операторов в таком виде:

Префикс номера
30000
30001
30002
30003
30004
30005
30006
30007
30008
30009
...
99999


и преобразуем вот в такой
Начало диапазона Окончание диапазона Провайдер Диапазоны
30000 30119 1 300[0123456789]xxxxxx; 301[01]xxxxxx
30120 30129 2 3012[0123456789]xxxxx
30130 30219 1 301[3456789]xxxxxx; 302[01]xxxxxx
30220 30229 3 3022[0123456789]xxxxx
30230 34099 2 3[123]xxxxxxxx; 30[3456789]xxxxxxx; 302[3456789]xxxxxx; 340[0123456789]xxxxxx
99995 99999 3 9999[56789]xxxxx


+
Тут все просто за счет того, что операторы изначально предоставляют тарифы с префиксами номеров, т.е. указывается только первые несколько цифр, как правило не больше 5. Далее создаем табличку, в которой перебираются все возможные комбинации префиксов номеров. После чего определяем диапазоны (начало и окончание диапазона) с лучшим тарифом. Далее нам нужно преобразовать этот диапазон в требуемый вид (столбец диапазон), для чего выполняем группировку с различной градацией - по первой цифре префикса, по первым двум цифрам, первым трем и т.д. Далее для каждой группы находим случаи когда кол-во сгруппированных строк равно соответственно 10000, 1000, 100 и т.д. Сам скрипт могу приложить чуть позже. В результате получаем то, что надо, и отрабатывает быстро.


Но как теперь сделать тоже самое по таблице РосСвязи?! Выглядит она вот так:
code from_num to_num capacity operator region
301 2100000 2109999 10000 АСВТ(Москва) Улан - Удэ |Республика Бурятия
301 2110000 2129999 20000 Ростелеком Улан - Удэ |Республика Бурятия
301 2150000 2169999 20000 Ростелеком Улан - Удэ |Республика Бурятия
301 2180000 2189999 10000 Ростелеком Улан - Удэ |Республика Бурятия
301 2191000 2199999 9000 Ростелеком Улан - Удэ |Республика Бурятия
301 2200000 2201999 2000 Компания ТрансТелеКом Улан - Удэ |Республика Бурятия
495 9419497 9419497 1 Альтернативная связь Москва
495 9419498 9419539 42 Вымпел-Коммуникации Москва


В выше описанном примере у меня есть все возможные переборы префиксов, если и здесь использовать всевозможные переборы, то понадобится 4 млрд. строк. Попробовал реализовать на мобильных кодах, это около 1 млрд. строк, но все жутко медленно работает, и место жрет по страшному.

Есть варианты как реализовать то что требуется? Может кто уже делал подобное?
6 май 15, 17:33    [17608882]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8823
Androgen1985,

а что не так? Росссвязь предоставляет нормализованные диапазоны в готовом виде.
6 май 15, 18:01    [17609095]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31969
Androgen1985
Есть варианты как реализовать то что требуется?
Так что требуется-то? Что нужно получить из показанной таблицы РосСвязи?
6 май 15, 21:15    [17609819]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
Нужно получить диапазоны вида - 300[0123456789]xxxxxx; 301[01]xxxxxx (ну не знаю как их еще назвать). Например для указанной выше таблицы РосСвязи, в случае если делаем группировку по оператору и региону, это должно выглядеть так:

code from_num to_num operator region Диапазоны
301 2100000 2109999 АСВТ(Москва) Улан - Удэ |Республика Бурятия 301210[0123456789]xxx
301 2110000 2129999 Ростелеком Улан - Удэ |Республика Бурятия 30121[12]xxxx
301 2150000 2169999 Ростелеком Улан - Удэ |Республика Бурятия 30121[56]xxxx
301 2180000 2189999 Ростелеком Улан - Удэ |Республика Бурятия 30121[8]xxxx
301 2191000 2199999 Ростелеком Улан - Удэ |Республика Бурятия 301219[123456789]xxx
301 2200000 2201999 Компания ТрансТелеКом Улан - Удэ |Республика Бурятия 301220[01]xxx
495 9419497 9419497 Альтернативная связь Москва 4959419497
495 9419498 9419539 Вымпел-Коммуникации Москва 495941949[89]; 49594195[0123]x


В последней строке у РосСвязи указан один диапазон, а в моем случае его требуется разбить на 2 диапазона, где в первая разбивка - префикс 495941949 далее одна из цифр 8 или 9, вторая - 49594195 далее одна из цифр 1, 2, 3, далее любая одна цифра. Такая запись диапазонов нужна для системы обзвона, и таблицу из РосСвязи нужно превратить в понятный для нее вид.
7 май 15, 08:15    [17610579]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Glory
Member

Откуда:
Сообщений: 104751
Androgen1985
Например для указанной выше таблицы РосСвязи, в случае если делаем группировку по оператору и региону, это должно выглядеть так:

И с какой трудностью вы столкнулись ? В чем проблема то ?
Вы написали какой-то код и он не работает ?
7 май 15, 08:18    [17610582]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
Я реализовывал похожую задачу (описано выше), но там условия были проще. Реализовывал путем перебора всевозможных вариантов номеров. Если в этом случае делать так же, то потребуется 4 млрд.строк. Попробовал реализовать на мобильных кодах, это около 1 млрд. строк, но все жутко медленно работает, и место жрет по страшному.
7 май 15, 08:30    [17610599]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Glory
Member

Откуда:
Сообщений: 104751
Androgen1985
Если в этом случае делать так же, то потребуется 4 млрд.строк.

4 млрд. строк кода ?
7 май 15, 08:31    [17610601]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
Glory,

нет). 4 млрд.строк номеров телефонов (все возможные комбинации).
7 май 15, 08:35    [17610611]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Glory
Member

Откуда:
Сообщений: 104751
Androgen1985
4 млрд.строк номеров телефонов (все возможные комбинации).

Т.е. ваш код генерирует больше запсией, чем вам нужно ?
7 май 15, 08:36    [17610615]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
Нет. Моя реализация строится на том, что я делаю сначала всевозможные варианты номеров. А потом выполняю группировку сначала по первой цифре номеров, потом по первым двум цифрам номера, потом по первым трем и т.д. В каждой группе определяю строки где сгруппированны данные по Х строк. Для примера:
Диапазон из РосСвязи
3012100000 3012109999 АСВТ(Москва) Улан - Удэ |Республика Бурятия


попал бы в группу, которая группировалась по первым 6 цифрам номера, по региону и оператору. По данной группировке смотрим, есть ли строки в которых кол-во сгруппированных записей равно 10000 (в нашем случае с префиксом 301210 это все номера от 3012100000 и до 3012109999). По префикс 301210 как раз кол-во сгруппированных данных 10000, следовательно все номера начинающиеся на 301210 находятся у одного оператора и в одном регионе. Диапазон формируется как - 301210[0123456789]xxx.
7 май 15, 09:02    [17610697]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ну так усоврешенствуйте свою реализацию.
В чем конкретная проблема то ?
7 май 15, 09:05    [17610707]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
В том, что данная реализация работает хорошо на 40 тыс. строк отлично, а на 4 или даже 1 млрд. строк очень медленно (предварительная подготовка только занимает пару дней) и сжирает много места.
7 май 15, 09:10    [17610730]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
Т.е. в моем текущем случае выполняется несколько группировок, апдейтов, инсертов и т.д. и одна группировка может идти пару дней, а таких группировок требуется провести несколько, а потом еще несколько запросов, так скрипты будут выполнятся месяц, прежде чем я получу результат
7 май 15, 09:12    [17610741]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Glory
Member

Откуда:
Сообщений: 104751
Androgen1985
В том, что данная реализация работает хорошо на 40 тыс. строк отлично, а на 4 или даже 1 млрд. строк очень медленно (предварительная подготовка только занимает пару дней) и сжирает много места.

Вас пожалеть ? Или похвалить ? Или поругать ?
Что нужно сделать то ?
7 май 15, 09:16    [17610757]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
нужен другой более быстрый алгоритм, который преобразует запись из РосСвязи вида
3012100000 3012109999 АСВТ(Москва) Улан - Удэ |Республика Бурятия


в
301210[0123456789]xxx
7 май 15, 09:19    [17610775]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Glory
Member

Откуда:
Сообщений: 104751
Androgen1985
нужен другой более быстрый алгоритм, который преобразует запись из РосСвязи вида
3012100000 3012109999 АСВТ(Москва) Улан - Удэ |Республика Бурятия


в
301210[0123456789]xxx

Т.е. нужно сравнить две строки на совпадающую и различающиеся части что ли ?
7 май 15, 09:20    [17610785]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
И да и нет

Вариант с диапазоном 3012100000-3012109999 простой, тут есть совпадающая часть, а дальше все возможные комбинации цифр - 301210[0123456789]xxx. С диапазоном 4959419498-4959419539 уже сложнее, так как его в итоге нужно разбить на 2 диапазона - 495941949[89]; 49594195[0123]x
7 май 15, 09:25    [17610812]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Glory
Member

Откуда:
Сообщений: 104751
Androgen1985
С диапазоном 4959419498-4959419539 уже сложнее, так как его в итоге нужно разбить на 2 диапазона - 495941949[89]; 49594195[0123]x

И почему же на 2 ? Кто определяет количество диапазонов ? Вы лично ?
7 май 15, 09:28    [17610823]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Merdoc
Member

Откуда: Новосибирск
Сообщений: 103
Glory,
Так ведь 4959419498-4959419539 нельзя записать одним "регулярным" выражением. У ТС и получается 2 (495941949[89]; 49594195[0123]x). Или вы к тому, что может быть больше - так видимо ТС забыл указать, что нужно минимальное их количество (100% он это подразумевал)
7 май 15, 09:44    [17610920]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
Нет, не я лично. Как Вы по другому укажите диапазон 4959419498-4959419539? Его требуется преобразовать в вид где есть фиксированная часть, далее переменная часть, которая может содержать только одну цифру и данные цифры следует явно указать в квадратных скобках, далее переменная часть которая указывается как "х".
7 май 15, 09:45    [17610922]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Glory
Member

Откуда:
Сообщений: 104751
Merdoc
Так ведь 4959419498-4959419539 нельзя записать одним "регулярным" выражением. У ТС и получается 2 (495941949[89]; 49594195[0123]x). Или вы к тому, что может быть больше - так видимо ТС забыл указать, что нужно минимальное их количество (100% он это подразумевал)

Т.е. вы за ТСа формулируете задачу, как
Записать произвольный диапазон в виде N "регулярных" выражений ?
7 май 15, 09:47    [17610938]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
Разбивка одного диапазона может быть и больше 2. Посмотрите пример в начале темы - для записи
Начало диапазона Окончание диапазона Диапазоны
30230 34099 3[123]xxxxxxxx; 30[3456789]xxxxxxx; 302[3456789]xxxxxx; 340[0123456789]xxxxxx

данный диапазон разбивается на 4
7 май 15, 09:48    [17610942]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Merdoc
Member

Откуда: Новосибирск
Сообщений: 103
Androgen1985,
А не пробовали что нить вроде рекурсии - где будет определятся все ли цифры конкретного разряда входят в выборку и если нет - то возвращаться определенный диапазон возможных значений.
Т.е. что то вроде
1. 4959419498-4959419539 Проверяете 1й разряд 8-9 входят 2 цифры. Вычерчиваем по ним диапазон и исключаем из выборки.
495941949[8,9]
2. 4959419500-4959419539
- Проверяете 1й разряд 0-9 все - значит будет x
- Проверяете 2й разряд 0-3 49594195[0,3]x
Чтобы выводило 0123 вместо - поступающих 0,3 можно хоть substr из подстроки 0123456789 использовать
7 май 15, 09:53    [17610968]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Merdoc
Member

Откуда: Новосибирск
Сообщений: 103
Glory,
Именно так
"Т.е. вы за ТСа формулируете задачу, как
Записать произвольный диапазон в виде N "регулярных" выражений ?"
+ Где N минимальное
7 май 15, 09:57    [17610997]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать диапазоны РосСвязи в заданный вид  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
Merdoc,

вот, что то подобное и нужно. Но на мой взгляд начинать справа нельзя, т.к. в нашем примере, нужно скорее начинать слева, определять фиксированную часть, а далее уже определять как то верхний диапазон. Далее уже с этого верхнего диапазона находить другой и так до окончания диапазона
7 май 15, 10:08    [17611073]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить