Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Распознавание региона по номеру сотового телефона
 
Добрый день коллеги.

Вот столкнулся с такой задачей, для меня она не тривиальная, но я честно гуглил и готовых решений не нашел, суть такая что есть база клиентов интернет магазина, 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
Оба решения не изящные, в рамках тренировки и расширения опыта я хотел бы попробовать решить его при помощи List.Generate или List.Accumulate или каким-либо еще способом в рамках PQ можно в рамках PBI.
Буду очень благодарен за пинок, в сторону быстрого решения что называется по Фэн Шую))
Подсчет активных ID на каждый день за пред период
 
Добрый день, пытаюсь посчbтать в DAX вот такую вещь.
Есть таблица изменения состояний с активного на неактивное, по идее активность длится 10 дней , то есть я вижу ID, в таблице и вижу что статус "Активен" значит он теперь будет активен 10 дней, правда внутри могут быть сбои, т.е. ID активировался 01.01.2022, 03.01.2022 может прийти что он "Неактивен", потом снова 04.01.2022 наприме, "Активен". Это технический сбой, мне нужно его игнорировать.
Задача на каждый день, мерой (что бы потом можно было фильтровать по связанным таблицам) посчитать сколько было активных ID всего в этот день, но именно сумму всех активных на день, а не только тех которые стали активными в этот день, т.е. сумму всех активных на этот день включая все те что стали активными 1-2-3 и до 10 дней назад. По сути мне надо взять предыдущие 10 дней, из большой таблицы статусов, взять внутри нее все ID которые пришли со статусом "Активен", хотя бы один раз, это будет означать, что я получил все ID которые могли быть активны на эту дату, все что было раньше не может быть активным, так как макс срок активности 10 дней, все что было позже, разумеется, не анализируем, оно для текущей даты еще не наступило, сгруппировать, что-бы убрать ошибочные двойные, тройниые и проч активации и я должен по идее получить сумму всех ID которые за период пред 10 дней были активированы, т.е. получу сумму активных ID на этот день.

Делаю это мерой, она прекрасно считает все, что было активировано, но когда я раскидываю ее по датам она упорно не ссумирует, а считает именно активации в этот день, а предыдущие 9 игнорирует )) как ее заставить ссумировать или мера вообще так делать не умеет?  

В PQ задача решилась несложно, но получивщуюся таблицу уже не отфильтровать связанными табличками. Возможно эту меру надо городить в отдельно таблице где не повторяются даты? тогда она сможет аккумулировать на каждую дату, надо тогда связь между ними делать?
Изменено: Константин Иванов - 15.09.2022 01:00:22
Фильтрация вложенной таблицы Power Query
 
Добрый день коллеги.

Не бейте сильно, если где-то уже данный вопрос обсуждался, но я курил и Chris Webb и все такое, прямого решения н нашел, хотя много полезных идей около моей проблемы прочитал.
Итак есть таблица по сути три столбца Index - просто порядковый номер продажи в рамках системы, ID товара, Сумма продажи, необходимо на каждый товар, на каждую продажу подсчитать накопленную по нему сумму, по сути простой нарастающий итог, но посегментно, для каждого товара свой итог, а не общую сумму продаж. При этом желательно не использовать операции прерывающие Query Folding, по сути, ка кодин из вариантов решения, я сджойнил таблицу саму на себя и новом столбце получил вложенную таблицу с продажами по данному товару, но теперь вот незадача, надо отфильтровать вложенную таблицу, т.е. убрать все продажи с индексом (порядковым номером, Index из начала постановки задачи) больше чем у текущей строки, т.е. убрать все более поздние продажи, чем в текущей строке

https://prnt.sc/t1jI9XH2_JN5

Я пробовал Table.TransformColumns но она не принимает значение Index из внешнего окружения, моего понимания принципов работы PQ пока не хватает что-бы либо изобрести другое решение не прерывающее Query Folding либо довести это решение до ума, помогите плиз!  
Изменено: Константин Иванов - 23.06.2022 16:36:18
Power Query добавление столбца индекса без прерывания Query Folding
 
Добрый день коллеги.

Есть таблица  со звонками клиентов, задача сделать Table.Join саму на себя со сдвигом , для нахождения предыдущего звонка клиента, происходит джойн по номеру клиента + столбец индекса. Всегда для этого использовал столбец индекса + второй столбец со сдвигом +1 или - 1, но всегда работало медленно.
Таблица 1 млн щаписей примерно и скорость становится критичной, плюс эта табличка дальше поступает в другую, и поскольку она не свернута, она отрубает сворачиваение второй таблички, поэтому прерывать Query Folding очень не хотелось бы.
Вопрос: можно ли сварганинть в Power Query столбец индекса (тупо пронумеровать строки в табличке подряд) любой функцией не прерывающей Query Folding.

Само по себе добавление и удаление столбцов с простой логикой, по моему опыту Query Folding не перывает, а вот кокнретно Table.AddIndexColumn - как раз недопустимо.

Заранее спасибо, ответ по теме гуглил, но не нашел ничего пкроме индексирование по сгруппированым данным, но это не то что мне нужно.  
Изменено: Константин Иванов - 20.12.2021 20:25:39
Страницы: 1
Наверх