Страницы: 1
RSS
Уникальные значение в PowerQuery и счёт количества повторение, вытащить при помощи PQ уник.знач. и подсчитать число повторений в исходной базе
 
Товарищи, всем доброго дня!
Прошу помощи у знающих. Подскажите пожалуйста, как можно проделать действие в PQ, которое в excel формулами не так сложно сделать, но при большом массиве работа тормозиться из-за нехватки ресурса компа.
Есть задача при помощи PQ в базе данных «лист База» проставить клиенту тип «Торгаш», если он встречается более одного раза в списке (список большой, несколько 10 тыс.строк). На листе «результат» изобразил, как это я делаю в excel: вытаскиваю уникальные значения, произвожу подсчёт сколько одно уник. значение встречается в базе «Клиент» и проставляю ему статус, после втягиваю в основную таблицу в столбец «Подбор» =ВПР-ом.
 
Пишу вам с телефона, могут быть ошибки в синтаксисе. Вам нужно что-то типам этого.

Это на случай если у вас на входе таблица, а не список (что скорее всего ).

Надеюсь, принцип из примера поймёте.
Код
T = Table.Buffer(YourTable),
Out = Table.AddColumn
  (
   T, 
   "Торгаши", 
   each let
     User = [ВашСтолбец],
     HowMany = List.Select(T[ВашСтолбец], each _ = User)
   in if List.Count(HowMany) > 1 then "Торгаш" else "Не торгаш", 
   type text
  ) 
Изменено: Alexey_Spb - 28.12.2018 13:00:30
 
Вот такой вариант:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Группировка = Table.Group(Источник, {"Клиент"}, {{"Количество", each Table.RowCount(_), type number}}),
    ДобавленСтолбец = Table.AddColumn(Группировка, "Подбор", each if [Количество] > 1 then "Торгаш" else null),
    УдаленныеСтолбцы = Table.RemoveColumns(ДобавленСтолбец,{"Количество"}),
    Слияние = Table.Join(Источник,{"Клиент"},УдаленныеСтолбцы,{"Клиент"})
in
    Слияние
Вот горшок пустой, он предмет простой...
 
Alexey_Spb, да всё верно, именно таблица на входе содержащая столбец Клиент.
Спасибо, попробую этот код внедрить.
На самом деле, внедрение у меня плохо проходит, так как в основном пользуюсь кнопочным вариантом работы в PQ/
 
tmhashNIK, если не сложно, сравните время выполнения моего кода и Алексея на вашем массиве. Мне прямо даже интересно.
Вот горшок пустой, он предмет простой...
 
PooHkrd, хорошо, отпишу обязательно!) Спасибо Вам!
 
Это не полный код, а его часть..
Вам нужно будет вставить его между первым let и написать потом ещё in  Out
Код
let
(ваш код) 
(мой код) 
in Out

Насчет скорости выполнения, самому интересно)  
Изменено: Alexey_Spb - 28.12.2018 13:59:39
 
tmhashNIK,
Вот вам файл с двумя запросами, моим и Алексея для сравнения.
Вот горшок пустой, он предмет простой...
 
Доброе время суток.
PooHkrd, ваш подход быстрее будет. У Alexey_Spb, на каждую строку таблицы выполняется фильтрация столбца Клиент по всем значениям, то есть сложность N^2. В вашем подходе в худшем случае группировка и слияние дадут N * Log(N; 2).
 
Андрей VG, да я примерно так и представлял, что перебор по всем строкам будет по-дольше выполняться плюс чутка времени на запихивание таблицы в память. Просто интересно на сколько это отразится во времени именно на массиве что указал ТС. В принципе то массив не шибко страшный для PQ вряд ли разница будет кардинальной.
Вот горшок пустой, он предмет простой...
 
PooHkrd, как вы сделали шаг слияние? мышкоклацанием или в расшаренном редакторе?
Изменено: artyrH - 28.12.2018 13:48:42
 
artyrH, отвечу за коллегу - нет, вручную код написали - Table.Join(#"Добавлен индекс",{"Клиент"},УдаленныеСтолбцы,{"Клиент"})
 
artyrH, сначала мышколацанием. через кнопку слияние запроса, где в качестве обеих таблиц указывается один и тот же запрос. В таком случае создается шаг, в котором объединяется последний шаг запроса с самим собой. Потом ручками первой аргумент функции меняем на Источник, убираем 5 и 6 аргументы, после чего переделываем Table.NestedJoin в Table.Join ибо в купе с операцией группировки он чуть шустрее работает и столбцы потом разворачивать не нужно.
Изменено: PooHkrd - 28.12.2018 13:51:23
Вот горшок пустой, он предмет простой...
 
спасибо позже попробую.
 
на вкладке Главная->объединить->объединить запросы. а тип соединения какой?
 
Цитата
artyrH написал:
а тип соединения какой?
Если вы будете использовать мою инструкцию, в которой сказано
Цитата
PooHkrd написал:
убираем 5 и 6 аргументы, после чего переделываем Table.NestedJoin в Table.Join
то любой. Ибо тип соединения это 6 аргумент в Table.NestedJoin, и он же 5 аргумент для Table.Join, а я его удаляю.
Этот аргумент не является обязательным для данных функций. Если он отсутствует, то по умолчанию производится тип слияния InnerJoin, оно же "Внутреннее".
Вот горшок пустой, он предмет простой...
 
PooHkrd, спасибо. пока не получается. попробую с самого начала, чтоб не путать названия столбцов.
получилось. спасибо
Изменено: artyrH - 28.12.2018 16:33:14
 
Цитата
PooHkrd написал: если не сложно, сравните время выполнения моего кода и Алексея на вашем массиве.
На массиве 70 тыс.ст. разницы не увидел, с учётом того, что комп у меня не очень современный (core i3 и excel 32-битный). Может от этого тоже зависит процесс выполнения одного и того же задания но разными действиями.
Страницы: 1
Наверх