Имеется список уникальных (неповторяющихся) телефонных номеров, на которые происходили вызовы от абонентов телефонной станции, где я работаю специалистом по учёту трафика. Для того, чтобы определить местоположение вызываемого номера (страна, область, город), а также стоимость вызова, имеется таблица, в которой для каждого региона прописан префикс телефонных номеров, однозначно определяющий, какой стране, области или городу принадлежит набранный номер. Префикс состоит из нескольких цифр (для международных звонков на первой позиции идут цифры "10", затем код страны, например, префикс Украины будет "10380", Беларуси - "10375", а с учетом региона и/или оператора связи к этим цифрам добавится ещё несколько:
Скрытый текст
"10380443", "10380444", "10380445" - "Украина, Киев", ... "1038063" - "Украина, Mob, Astelit" и так далее.
Скрытый текст
Отсюда понятно, что набранные номера, начинающиеся с этих цифр, относятся к принадлежащему этому префиксу региону. Максимальное количество символов (цифр) в префиксе - 10, минимальное - 2. Моя задача - найти для каждого номера соответствующий ему регион и посчитать стоимость вызова. До сих пор я решал эту задачу на листе Excel с помощью формул: либо "многоэтажная" ЕСЛИОШИБКА-ВПР, которая последовательно ищет в таблице префиксов сначала по первым десяти символам номера, затем, если не найдено - по девяти и так до первых двух цифр, пока не найдет подходящий префикс; и любезно написанная для меня участником форума PlanetaExcel уважаемым R Dmitry массивная UDF, которая выполняет ту же задачу - ищет подходящий префикс (или соответствующее ему значение из таблицы префиксов). Поскольку обрабатываемых данных по телефонному трафику довольно много, производить расчёты на листах Excel путем многократных копирований и вставок больших массивов данных да ещё с десятками тысяч формул стало очень обременительно и чревато ошибками при расчётах. Обратил внимание на новые революционные методы работы с большими данными в Excel - Power Query и PowerPivot. К сегодняшнему дню большую часть работы переложил на эти продвинутые инструменты, но вышеописанную задачу пока решаю по старинке - формулами, а затем полученный результат отправляю в модель данных PowerPivot. Тут как раз проявляется недостаток формул - либо очень тяжёлая ВПР, либо несовместимая с работой в "умных" таблицах "массивная" UDF. Хотелось бы решать эту задачу средствами Power Query. Пробовал сам - создавал дополнительные столбцы к таблице с номерами: 10 первых символов, 9, 8 и тд. Затем по этим столбцам поэтапно через объединение запросов с таблицей префиксов создавал новые таблицы, потом объединял их, но это было очень ресурсоёмко и долго. К тому же, не исключались ситуации, когда к уже найденному префиксу с большей длиной, например, для номера 10(380)443-123-4567 найдено [10380443 - "Украина, Киев"], на следующих этапах объединения таблиц добавлялся префикс [10380 - Украина], который формально тоже удовлетворяет условиям отбора, но не должен попадать в результат, поскольку уже найден наиболее подходящий префикс. Вторая сложность - в таблице префиксов есть столбец Дата. В течении года тарифы на отдельные направления могут меняться, я решил не работать с разными таблицами префиксов в зависимости от даты вызова, а объединить все таблицы префиксов с разными датами в одну таблицу и при расчёте стоимости учитывать дату звонка, сопоставляя её с датой тарифа. Эту проблему я уже решил в PowerPivot, через составное ключевое поле [Prefix&"|"Date"]. Поэтому пока прошу помощи в Power Query - или написать функцию поиска префикса для номера, или другим способом, чтобы избавиться от постоянного прописывания тяжёлых формул в листах Excel.
Не знаком с расценками на подобные работы, хотелось бы уложиться в 1 тысячу, максимум - 1 500 рублей. С уважением, Виктор Косенков. Московская область, город Электросталь [телефоны удалены]
Спасибо, Юрий. Правила прочитал, конкретно по телефонам вроде бы нет ограничений, но, пожалуй, Вы правы, мошенники могут использовать такие данные в неблаговидных целях.
Прежде всего есть трафик - каждый месяц отдельный csv файл, где порядка 110 - 150 тысяч записей. Одна запись - один звонок. После загрузки этих файлов в Power Query и отфильтровывания ненужных вызовов (входящих, несостоявшихся) остается около 500 000 записей. Из этого запроса делаю запрос уникальных, неповторяющихся номеров, которые были набраны и по которым в дальнейшем нужно произвести необходимые расчеты - за 10 месяцев 2017 года таких уникальных номеров набралось около 35 тысяч. Каждый месяц этот список будет увеличиваться, к концу года тысяч на 7 прибавится, значит максимум 42 тысячи номеров, к которым нужно из таблицы префиксов подобрать префиксы для дальнейших расчётов. Скорость - понятно, хочется чтобы работало всё это побыстрее, не дольше 2-3 минут.
Юрий, если не получится в Power Query, придется решать на листе, но желательно сджойнить эти таблицы в PQ, чтобы потом сразу передать их в модель данных PowerPivot для дальнейших расчетов и создания отчетов.
Если макрос получится быстрее существующих формул, можно попробовать, но PQ никуда не денется, там происходит много чего другого. Данная операция по нахождению префиксов только маленький кирпичик в большом процессе тарификации телефонных переговоров.
С макросом пока рано что-то говорить нужно пробовать (попробовал один из вариантов - неудачно - скорость очень низкая). SQL конечно понятнее, и даже знаю как нужно сделать (сам запрос SQL), но к сожалению с PQ не работаю. Пока не претендую! Решил макросом, выслал предложение в личке.
Доброе время суток. Сделал версию на Power Query с добавлением столбца первых двух символов префикса для партицирования соединения таблиц. Соединяются на моём ноуте за 35 секунд. Непонятно, правда, существование двух одинаковых префиксов одной и тоже страны, но с разными расценками.
skais675 написал: решение макросом на компе 12 летней давности - 27 сек.
Что-то долго на VBA-то для такой задачи, типовое решение со словарём, пусть даже нужно выводить все строки из tPrefix по датам. Увы, PQ так "руки" не выкрутишь, хотя надо попробовать. У меня на том же ноуте (пусть и мобильный i7, но шестилетней давности) 0,3 секунды. Собственно, долго ни должно быть O(23332 * 8 * Log(26208) ).
Цитата
skais675 написал: всё же надеюсь, завтра появятся Андрей Гриценко
Хм, а я тогда кто? Или у меня на форуме появился одновременно и тёзка и однофамилец?
Влад, я не хотел оскорбить Вас небольшой суммой, но всё же такое решение не совсем то, что я хотел изначально. Впрочем, Юрий задавал мне вопрос по этому поводу и я согласился посмотреть Ваш макрос. Чтобы не выглядеть жмотом, пересылаю ещё 500 р. Вы действительно потратили своё время и было бы несправедливо отказываться от изначально объявленной мной же суммы вознаграждения. Спасибо.
Я Вас и мел в виду. Обычно на форуме есть кто то из владеющих Power BI инструментами, а вчера кроме Влада никто не заинтересовался задачей и только на ночь глядя появились Вы.
Цитата
Андрей VG написал: Всё же странно, что Виктор не задал задание в профильной BI группе в Facebook.
Мне не совсем удобно напрягать крутых профи группы своими дилетантскими вопросами, хотя несколько раз мне там очень хорошо помогли.