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