Добрый день коллеги.
Вот столкнулся с такой задачей, для меня она не тривиальная, но я честно гуглил и готовых решений не нашел, суть такая что есть база клиентов интернет магазина, 35.000 номеров, есть спарсенная при помощи PQ база кодов операторов по регионам, при помощи нее сопоставляю кусок номера (не всегда одинаковой длины) можно определить точно город регистрации сим карты. Сложность в том что кода из 3 первых цифр номера, префикса недостаточно, есть масса номеров, которые распределены между разными регионами, т.е. если номер PPP-NNNNNNN, то номера с префиксом PPP могут быть например Билайн тут же Мегафон, и тут же еще и разные регионы внутри одного оператора, поэтому где то совпадает PPP-N где-то PPP-NN и так далее.
Я саму задачу решил тупым джонойном выделил префикс каждого номера, сджойнил табличку всех возможных вариантов кодов к этому префиксу и далее тупым перебором нашел соответствия , при каждой итерации я отрезал от искомого номера такой кусок впереди, который будет равен по длине тому что есть в базе кодов операторов. Затем просто фильтрация, все решено, но остались вопросы, вот кусок этого решения
Так же удалось решить при помощи List.Transform, сджойненную таблицу напротив каждого номера, я пытался обработать, но решение очень медленное, я так и не дождался загрузки в отчет ни разу
Оба решения не изящные, в рамках тренировки и расширения опыта я хотел бы попробовать решить его при помощи List.Generate или List.Accumulate или каким-либо еще способом в рамках PQ можно в рамках PBI.
Буду очень благодарен за пинок, в сторону быстрого решения что называется по Фэн Шую))
Вот столкнулся с такой задачей, для меня она не тривиальная, но я честно гуглил и готовых решений не нашел, суть такая что есть база клиентов интернет магазина, 35.000 номеров, есть спарсенная при помощи PQ база кодов операторов по регионам, при помощи нее сопоставляю кусок номера (не всегда одинаковой длины) можно определить точно город регистрации сим карты. Сложность в том что кода из 3 первых цифр номера, префикса недостаточно, есть масса номеров, которые распределены между разными регионами, т.е. если номер PPP-NNNNNNN, то номера с префиксом PPP могут быть например Билайн тут же Мегафон, и тут же еще и разные регионы внутри одного оператора, поэтому где то совпадает PPP-N где-то PPP-NN и так далее.
Я саму задачу решил тупым джонойном выделил префикс каждого номера, сджойнил табличку всех возможных вариантов кодов к этому префиксу и далее тупым перебором нашел соответствия , при каждой итерации я отрезал от искомого номера такой кусок впереди, который будет равен по длине тому что есть в базе кодов операторов. Затем просто фильтрация, все решено, но остались вопросы, вот кусок этого решения
Код |
---|
#"Merged Queries" = Table.NestedJoin(Predicat, {"pref"}, prefix_table, {"prefix"}, "prefix_table", JoinKind.Inner), #"Expanded prefix_table" = Table.ExpandTableColumn(#"Merged Queries", "prefix_table", {"prefix", "Count", "Оператор", "Регион", "Номер"}, {"prefix", "Count.1", "Оператор", "Регион", "Номер"}), #"Changed Type1" = Table.TransformColumnTypes(#"Expanded prefix_table",{{"Номер", type text}}), Check = Table.AddColumn(#"Changed Type1", "equal", (string)=> [ check1 = if Text.Start(string[Телефон], Text.Length(string[Номер])) = string[Номер] then 1 else 0] [check1] ), #"Filtered Rows1" = Table.SelectRows(Check, each ([equal] = 1)) in #"Filtered Rows1" |
Так же удалось решить при помощи List.Transform, сджойненную таблицу напротив каждого номера, я пытался обработать, но решение очень медленное, я так и не дождался загрузки в отчет ни разу
Код |
---|
let mergedqueries = Table.NestedJoin(Source, {"prefix"}, prefix_table, {"prefix"}, "table1", JoinKind.LeftOuter), rec = Table.ToRecords(Table.TransformColumns(mergedqueries, {{"table1", each Table.ToRecords(_)}})), buffer = List.Buffer(rec), check = List.Transform (buffer, (mainlist)=> [ sublistchange = List.Transform (mainlist[table1], (sublist)=> [ sublistc = if Text.Start(mainlist[Телефон], Text.Length(sublist[Номер]))=sublist[Номер] then sublist[Регион] else null ] [sublistc] ), result = Record.AddField(mainlist,"region", sublistchange) ] [result] ), conv = Table.FromList(check, Splitter.SplitByNothing(), null, null, ExtraValues.Error), #"Expanded Column1" = Table.ExpandRecordColumn(conv, "Column1", {"Телефон", "region"}, {"Телефон", "region"}), trnsf = Table.TransformColumns(#"Expanded Column1", {{"region", (list)=> [ maxlist = List.Max(list) ][maxlist] }}) in trnsf |
Буду очень благодарен за пинок, в сторону быстрого решения что называется по Фэн Шую))