Добрый день, уважаемые форумчане. Пытался найти аналог ИНДЕКС+ПОИСПОЗ excel, в PQ. Нашел способ это можно сделать, через объединить, но заметил странность (продемонстрирована на Листе 2 [строка 2-3], если в правой таблице повторяется значение, то он дублирует значение левой строки и добавляет 2 или последующее значение правой). Использовал JoinKind.LeftOuter, для добавления данных к левой таблице из правой. Как можно оставить оставить только последнее найденной значений правой таблицы? На Листе 3, удалось достичь желаемого эффекта (на 100 тысяч строк у меня обновилось за 16,5 сек., при повторных обновлениях результат 9-10 сек.) но может это можно сделать как-то более правильно. ------- Можете подсказать отличия Table.NestedJoin и Table.Join?, по справочнику не совсем понятны их различия.
ymal_qeb написал: Можете подсказать отличия Table.NestedJoin и Table.Join?, по справочнику не совсем понятны их различия.
Для примера объясню про вариант левый внешний (он же JoinKind.LeftOuter) как самый часто используемый. Table.Join прилепляет к каждой строке таблицы все столбцы из второй табилцы по соответствию ключевых полей, если одной строке Таблицы1 соответствует несколько из таблицы2, то они размножаются по количеству совпадающих значений. Table.NestedJoin - создает столбец в таблице 1, в каждую ячейку которого помещает те строки таблицы2, которые соответствуют по ключевым полям. Далее вы уже можете делать с этими таблицами что вам заблагорассудится - в том числе и оставить только какую то одну строку, если их там больше чем одна. Правда есть нюанс, на больших массивах если вы будете использовать Table.NestedJoin, после чего пытаться что-то делать с полученными в столбцах таблицами, то скорее всего будет сильно тупить. Чтобы ускорить всякие умные дядьки рекомендуют использовать функцию Table.AddKey.
Цитата
ymal_qeb написал: последнее найденной значений правой таблицы?
ymal_qeb, зачем обманываете? У вас данные берутся из таблицы где нет дат. Сделал вариант с выбором по максимальному индексу. Думаю разберетесь. Вставьте код в запрос "Таблица1"
Код
let
Источник = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
#"Сгруппированные строки" = Table.Group(Источник, {"Документ"}, {{"Количество", each Table.Max(_,"№"), type record}}),
#"Развернутый элемент Количество" = Table.ExpandRecordColumn(#"Сгруппированные строки", "Количество", {"№"}, {"№"}),
source1= Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
#"Измененный тип" = Table.TransformColumnTypes(source1,{{"Дата документа", type date}, {"Номер документа", Int64.Type}, {"Тип документа", type text}}),
#"Добавлен пользовательский объект" = Table.AddColumn(#"Измененный тип", "Пользовательская", each Text.From([Тип документа])&" № "&Text.From([Номер документа])&" от "&Text.Start(Text.From([Дата документа]), 10)),
#"Слияние таблицы" = Table.Join(#"Добавлен пользовательский объект", {"Пользовательская"}, #"Развернутый элемент Количество", {"Документ"}, JoinKind.LeftOuter),
#"Удаленные столбцы" = Table.RemoveColumns(#"Слияние таблицы",{"Пользовательская", "Документ"})
in
#"Удаленные столбцы"
PooHkrd, простите (просто в исходнике есть дата и исходя из нее формируется номер), машинально ответил. если как в примере но по максимальному значению второй таблицы колонки № ---- подскажите, а Table.Join, тоже начинает тупить на больших массивах?