Страницы: 1
RSS
PQ. Есть ли возможность в Table.Join использовать параметр сравнения как приблизительный?
 
Здравствуйте, пожалуйста дайте комментарии, есть ли возможность в Table.Join использовать параметр сравнения как приблизительный?
Например, чтобы было понятнее. Можно ли написать что-нибудь вроде:
Код
Переменная = 
Table.Join (
   ТаблИсточн1,
         {"Колонка1", "Колонка2", 
                     ("Колонка3" // или, если Колонка3=null, то любое значение (Join опускает параметр и ищет только по 2-ум
           ) },
   ТаблИсточн2, 
   {"Колонка5","Колонка6","Колонка7"})

Суть в чем, есть определенный запрос  с большим числом строк, данные вцелом однородные, и для большой точности объединения запросов мне нужно 3 параметра, однако есть часть строк, в которых третий параметр отсутсвует, при этом 2 предыдущих обязательно отъиграют, и мне этого достаточно чтобы связь была объединена. Но по части строк, нужно обязательно 3 совпадения по таблице Источнику1.
Как выйти из этой ситуации, 2 раза запрос делать не хотелось бы, сначала выбирая только совпадения по 3м столбцам, потом повторным запросом добавляя совпадения по 2м столбцам и применяя какие-то фильтры для отсеивания.
Есть ли другие решения?

Придумать документ сходу не могу, что-то в голову не приходит ничего, но в рабочей книге именно похожая ситуация.
Изменено: lostandleft - 11.03.2020 14:01:03
 
Есть такая функция Table.FuzzyJoin
Имеется в наличии в последних обновлениях в О365 и в PBI. Это если про приблизительный поиск.
А то что вы описываете - это нечто другое, в чем проблема сделать 2 джойна (сначала по двум, потом по трем ключам) и сджойнить их результаты?
Изменено: PooHkrd - 11.03.2020 14:07:34
Вот горшок пустой, он предмет простой...
 
PooHkrd, Спасибо за участие!
Сложности в общем то нет, просто Joinov будет тогда не 2 а 4, при этом из выборки данных будет куча перекрытий. Т.е. если совпадут 3 join, то при повторной выборки из 2х Join обязательно попадутся теже самые значения, их придется отсеивать фильтровать.
А учитывая то, что у меня наклевывается 4 join в некоторых строках, то значит, по хорошему join по этой схеме дожно быть минимум 3, В общем лапша получится а не код.
Было бы круто, если бы на этапе JOIN можно было задавать условие с помощью IF или свичей, если определенная колонка соответсвует тем-то и тем-то параметрам, то используем Join с 3мя вхождениями, а если соответсвует другим значениям тогда используем join с 2мя вхождениями.
 
Цитата
lostandleft написал:
задавать условие с помощью IF
Table.NestedJoin
 
Доброе время суток
Михаил Л, коллега, а не проще ли?
Код
let
    Source = Excel.CurrentWorkbook(){[Name="_1"]}[Content],
    Type1 = Table.TransformColumnTypes(Source,{{"Даты", type date}, {"Столбец1", Int64.Type}, {"Столбец_1", type text}}),
    Source2 = Excel.CurrentWorkbook(){[Name="_2"]}[Content],
    Type2 = Table.TransformColumnTypes(Source2,{{"Даты_2", type date}, {"Столбец2", Int64.Type}, {"Столбец_2", type text}}),
    Add = Table.AddColumn(Type1, "a", each 
        if [Столбец_1] = null then
            Table.NestedJoin(Type1,{"Даты"},Type2,{"Даты_2"},"aba",1)
        else
            Table.NestedJoin(Type1,{"Даты", "Столбец_1"},Type2,{"Даты_2", "Столбец_2"},"aba",1)
    )
in
    Add

Цитата
lostandleft написал:
или, если Колонка3=null
Ну, так и разбейте ТаблИсточн1 на две части с Колонка3 <> null и Колонка3 = null. Делайте Join по частям, а затем Combine
 
Андрей VG, запрос смотрится проще и отработает быстрее, только надо добавить {_}[aba]  
Изменено: Михаил Л - 12.03.2020 01:39:53
 
Андрей VG, Круто, спасибо, получается, грубо говоря мы добавляем колонку по определенному условию, а в качестве значения колонки берем NestedJoin.
Спасибо, есть над чем подумать, я почему-то полностью начал игнорировать NestedJoin, не однократно на форуме видел сообщения о том, что он медленнее чем Join. Но в данном случае, это явно удобнее.
Спасибо.
 
Цитата
Михаил Л написал:
только надо добавить {_}[aba]
Да, спасибо  за замечание - упустил.
lostandleft, по моему вы меня перепутали с Михаил Л. Я не предлагал использовать NestedJoin. Какое из решений будет быстрее - надо тестировать.
 
Цитата
Андрей VG написал:
Какое из решений будет быстрее - надо тестировать
Я как понимаю, в моем варианте выполняются оба соединения и после по условию выбирается нужный. В вашем варианте по условию выбирается нужное соединение и выполняется только единственное нужное соединение. Как то так
А Table.Join не прикручивается
Изменено: Михаил Л - 12.03.2020 06:54:57
 
Михаил Л, Я тоже так понял, изюминка именно в том, чтобы сначал обработать условие а уже после делать тот join который требуется. И в этом вся крутость.
Это будет явно быстрее, чем обрабатывать кучу join потом выбирать результаты, фильтровать их и так далее.
Спасибо господа, думаю это многим пригодится!
 
Цитата
lostandleft написал:
и так далее
Да я уже сам не рад что предложил свое решение :)  
 
Есть еще один "хитрый план"  ;) на базе примера от Михаил Л:
Код
let
    Source = Excel.CurrentWorkbook(){[Name="_1"]}[Content],
    Type1 = Table.TransformColumnTypes(Source,{{"Даты", type date}, {"Столбец1", Int64.Type}, {"Столбец_1", type text}}),
    Source2 = Excel.CurrentWorkbook(){[Name="_2"]}[Content],
    Type2 = Table.TransformColumnTypes(Source2,{{"Даты_2", type date}, {"Столбец2", Int64.Type}, {"Столбец_2", type text}}),
    MergedQueries = Table.Join( Type1, {"Даты", "Столбец_1"}, Type2 & Type2[[Даты_2],[Столбец2]], {"Даты_2", "Столбец_2"}, JoinKind.LeftOuter )
in
    MergedQueries

Оно?
Вот горшок пустой, он предмет простой...
 
Цитата
lostandleft написал:
обрабатывать кучу join потом выбирать результаты, фильтровать их и так далее
Еще вариант вот прям оно :)
С Table.Join как то не просто
Код
// _1 (3)
let
    Source = Excel.CurrentWorkbook(){[Name="_1"]}[Content],
    Type1 = Table.TransformColumnTypes(Source,{{"Даты", type date}, {"Столбец1", Int64.Type}, {"Столбец_1", type text}}),
    Source2 = Excel.CurrentWorkbook(){[Name="_2"]}[Content],
    Type2 = Table.TransformColumnTypes(Source2,{{"Даты_2", type date}, {"Столбец2", Int64.Type}, {"Столбец_2", type text}}),
    Add = Table.AddColumn(Type1, "a", each [   
                                              l=[Столбец1],
                                              v=[Даты], 
                                              a=[Столбец_1],
                                              b= Table.Join(Type1,{"Даты", "Столбец_1"},Type2,{"Даты_2", "Столбец_2"},1), 
                                              c= Table.Join(Type1,{"Даты"},Type2,{"Даты_2"},1), 
                                              dv = if a = null then c else b, 
                                              e = Table.SelectRows(dv, each [Даты] = v and [Столбец_1] =a and [Столбец1] =l )  ][e]),
    #"Expanded {0}" = Table.ExpandTableColumn(Add, "a", {"Даты_2", "Столбец2", "Столбец_2"})
in
    #"Expanded {0}"
Страницы: 1
Наверх