Страницы: 1
RSS
Power Query. Слияние по совпадению начала номера договора.
 
Добрый день!
Как мне подправить код в PQ, чтобы вместо обычного слияния стало слияние по частичному совпадению.
Код
= Table.NestedJoin(Таблица1,{"Договор kak он уkaзaн в нaзнaчении"},Таблица2,{"Договор в базе"},"Таблица2",JoinKind.Inner)

Стандартный код найдет одно совпадение.
Совпадение должно быть только по началу слова, если значение из первой таблицы встретится в середине значения из второго, то такое значение подтягивать не нужно.
Что то типа "если значение из первой таблицы = левсимв(значение из второй таблицы;длстр(значение из первой таблицы))".
Или же до PQ делал это через ВПР "со звездочкой" после искомого параметра. (пытаюсь объяснить логику :) )

Спасибо.
Изменено: whateverlover - 09.07.2020 21:16:46
 
Доброе время суток
Цитата
whateverlover написал:
Table.NestedJoin
А почему не хотите воспользоваться Table.FuzzyJoin?
 
вариант с Table.FuzzyNestedJoin
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
Expression.Error: Имя "Table.FuzzyNestedJoin" не распознано. Убедитесь в том, что оно написано верно.

У меня Excel 2010, поэтому не работает? Или как-то включить нужно в настройках сначала неточный поиск этот?
И так и не разобрался как он работает...если договор будет изначальный F12345-1234567, а во второй таблице  F12345-1234576, то он тоже его подтянет?
Изменено: whateverlover - 09.07.2020 22:05:10
 
Слияние здесь не поможет, я думаю. Ну или коллеги меня удивят ))
Как мне видится, нужно будет делать допстолбец в одной из таблиц (меньшей) с проверкой вхождения и подстановкой найденного значения, а потом уже джойн.
Но выглядит это трудоемко, конечно.
F1 творит чудеса
 
Доброе время суток
Цитата
whateverlover написал:
если договор будет изначальный F12345-1234567, а во второй таблице  F12345-1234576, то он тоже его подтянет?
Естественно, вы же поставили условием
Цитата
whateverlover написал:
стало слияние по частичному совпадению... Совпадение должно быть только по началу слова
Более того выполниться и это
Цитата
whateverlover написал:
делал это через ВПР "со звездочкой" после искомого параметра.
Тогда в чём ваши сомнения в решение на Power Query? Пока, по столь скудно описанному набору данных, можно во второй таблице сделать разбиение по / и левую часть использовать для Join.
Если же переходить к решению ВПР с *, предполагая, что "Договор kak он уkaзaн в нaзнaчении" эталон, после которого в другой таблице может быть что-то только дописано, то используете NestedJoin с декартовым объединением и ищите по эталонному значению совпадение по началу строки, используя Test.StartsWith
Изменено: Андрей VG - 10.07.2020 05:41:39
 
Цитата
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
 
Ну и я как всегда со своим "бутербродом", но теперь с модифицированной сортировкой:

Скрытый текст
Вот горшок пустой, он предмет простой...
 
А точно нужно, чтобы из базы пропал договор F02672-0004444?
F1 творит чудеса
 
В общем, на всякий, если нужно не внутреннее, а левое внешнее объединение:
Код
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
F1 творит чудеса
 
Цитата
Андрей VG написал:
Естественно, вы же поставили условием
Имелось ввиду, что позиция из первой таблицы должна быть началом позиции из второй в полной своей длине)
Цитата
Андрей VG написал:
сделать разбиение по / и левую часть использовать для Join
Вчера так и сделал в принципе) не знаю насколько точность моей таблички пострадала от этого, но вроде сработало)

Всем спасибо за варианты! Всегда разбираю все предлагаемые варианты, чтобы обучаться на ваших примерах)
Изменено: whateverlover - 10.07.2020 10:58:58
 
Цитата
Максим Зеленский написал:
пропал договор F02672-0004444?
Ну ХЗ, я делал как в примере. Там его нема.
Если вопрос ко мне.
И еще вариант, если номера договоров стандартизированы, и всегда имеют длину в 14 символов:

Скрытый текст
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх