Есть задача преобразовать диапазоны номеров взятых с сайта РосСвязи. Ранее решал похожую, но условия были проще, нужно было определить лучшую цену предлагаемую провайдерами по разным направлениям и вывести диапазоны. Для примера имеем тарифные сетки операторов в таком виде:
Префикс номера | 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 млрд. строк, но все жутко медленно работает, и место жрет по страшному.
Есть варианты как реализовать то что требуется? Может кто уже делал подобное?