Добрый день! Как мне подправить код в PQ, чтобы вместо обычного слияния стало слияние по частичному совпадению.
Код
= Table.NestedJoin(Таблица1,{"Договор kak он уkaзaн в нaзнaчении"},Таблица2,{"Договор в базе"},"Таблица2",JoinKind.Inner)
Стандартный код найдет одно совпадение. Совпадение должно быть только по началу слова, если значение из первой таблицы встретится в середине значения из второго, то такое значение подтягивать не нужно. Что то типа "если значение из первой таблицы = левсимв(значение из второй таблицы;длстр(значение из первой таблицы))". Или же до PQ делал это через ВПР "со звездочкой" после искомого параметра. (пытаюсь объяснить логику )
Expression.Error: Имя "Table.FuzzyNestedJoin" не распознано. Убедитесь в том, что оно написано верно.
У меня Excel 2010, поэтому не работает? Или как-то включить нужно в настройках сначала неточный поиск этот? И так и не разобрался как он работает...если договор будет изначальный F12345-1234567, а во второй таблице F12345-1234576, то он тоже его подтянет?
Слияние здесь не поможет, я думаю. Ну или коллеги меня удивят )) Как мне видится, нужно будет делать допстолбец в одной из таблиц (меньшей) с проверкой вхождения и подстановкой найденного значения, а потом уже джойн. Но выглядит это трудоемко, конечно.
whateverlover написал: если договор будет изначальный F12345-1234567, а во второй таблице F12345-1234576, то он тоже его подтянет?
Естественно, вы же поставили условием
Цитата
whateverlover написал: стало слияние по частичному совпадению... Совпадение должно быть только по началу слова
Более того выполниться и это
Цитата
whateverlover написал: делал это через ВПР "со звездочкой" после искомого параметра.
Тогда в чём ваши сомнения в решение на Power Query? Пока, по столь скудно описанному набору данных, можно во второй таблице сделать разбиение по / и левую часть использовать для Join. Если же переходить к решению ВПР с *, предполагая, что "Договор kak он уkaзaн в нaзнaчении" эталон, после которого в другой таблице может быть что-то только дописано, то используете NestedJoin с декартовым объединением и ищите по эталонному значению совпадение по началу строки, используя Test.StartsWith
whateverlover написал: вместо обычного слияния стало слияние по частичному совпадению
Сначала слияние, потом поиск частичного совпадения
Код
let
Src = Table.AddIndexColumn(Table.Join(Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
{}, Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],{}),"id"),
Flt = Table.SelectRows(Src, each Text.StartsWith([Договор в базе], [#"Договор kak он уkaзaн в нaзнaчении"])),
Srt = Table.RemoveColumns(Table.Sort(Flt,{{"Договор kak он уkaзaн в нaзнaчении",0},{"id",0}}),{"id"})
in
Srt
Ну и я как всегда со своим "бутербродом", но теперь с модифицированной сортировкой:
Скрытый текст
let Source=Table.AddColumn(Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],"T",each1), Custom1=Table.AddColumn(Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],"T",each2), Custom2=Table.DuplicateColumn(Source,"Договор kak он уkaзaн в нaзнaчении","Договор в базе")&Custom1, SortedRows=Table.Sort(Custom2,{{"Договор в базе",Order.Ascending},{"T",Order.Ascending}}), FilledDown=Table.FillDown(SortedRows,{"Договор kak он уkaзaн в нaзнaчении"}), FilteredRows=Table.SelectRows(FilledDown,each([Дата]<>null)andText.StartsWith([Договор в базе],[#"Договор kak он уkaзaн в нaзнaчении"])) in FilteredRows
В общем, на всякий, если нужно не внутреннее, а левое внешнее объединение:
Код
let
Dogovor = List.Buffer(Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content][Договор kak он уkaзaн в нaзнaчении]),
Baza = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
ChangedType = Table.TransformColumnTypes(Baza,{{"Договор в базе", type text}, {"Дата", type datetime}}),
AddedCustom = Table.AddColumn(ChangedType, "Договор", each List.Select(Dogovor, (q)=>Text.StartsWith([Договор в базе],q)), type {text}),
Expanded = Table.ExpandListColumn(AddedCustom, "Договор")
in
Expanded
Ну ХЗ, я делал как в примере. Там его нема. Если вопрос ко мне. И еще вариант, если номера договоров стандартизированы, и всегда имеют длину в 14 символов:
Скрытый текст
let Custom1=Table.AddColumn(Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],"T",eachText.Start([Договор в базе],14),typetext), Merged=Table.NestedJoin(Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],{"Договор kak он уkaзaн в нaзнaчении"},Custom1,{"T"},"Custom1",JoinKind.Inner), Expanded=Table.ExpandTableColumn(Merged,"Custom1",{"Договор в базе","Дата"},{"Договор в базе","Дата"}) in Expanded