Здравствуйте, пожалуйста дайте комментарии, есть ли возможность в Table.Join использовать параметр сравнения как приблизительный? Например, чтобы было понятнее. Можно ли написать что-нибудь вроде:
Код
Переменная =
Table.Join (
ТаблИсточн1,
{"Колонка1", "Колонка2",
("Колонка3" // или, если Колонка3=null, то любое значение (Join опускает параметр и ищет только по 2-ум
) },
ТаблИсточн2,
{"Колонка5","Колонка6","Колонка7"})
Суть в чем, есть определенный запрос с большим числом строк, данные вцелом однородные, и для большой точности объединения запросов мне нужно 3 параметра, однако есть часть строк, в которых третий параметр отсутсвует, при этом 2 предыдущих обязательно отъиграют, и мне этого достаточно чтобы связь была объединена. Но по части строк, нужно обязательно 3 совпадения по таблице Источнику1. Как выйти из этой ситуации, 2 раза запрос делать не хотелось бы, сначала выбирая только совпадения по 3м столбцам, потом повторным запросом добавляя совпадения по 2м столбцам и применяя какие-то фильтры для отсеивания. Есть ли другие решения?
Придумать документ сходу не могу, что-то в голову не приходит ничего, но в рабочей книге именно похожая ситуация.
Есть такая функция Table.FuzzyJoin Имеется в наличии в последних обновлениях в О365 и в PBI. Это если про приблизительный поиск. А то что вы описываете - это нечто другое, в чем проблема сделать 2 джойна (сначала по двум, потом по трем ключам) и сджойнить их результаты?
PooHkrd, Спасибо за участие! Сложности в общем то нет, просто Joinov будет тогда не 2 а 4, при этом из выборки данных будет куча перекрытий. Т.е. если совпадут 3 join, то при повторной выборки из 2х Join обязательно попадутся теже самые значения, их придется отсеивать фильтровать. А учитывая то, что у меня наклевывается 4 join в некоторых строках, то значит, по хорошему join по этой схеме дожно быть минимум 3, В общем лапша получится а не код. Было бы круто, если бы на этапе JOIN можно было задавать условие с помощью IF или свичей, если определенная колонка соответсвует тем-то и тем-то параметрам, то используем Join с 3мя вхождениями, а если соответсвует другим значениям тогда используем join с 2мя вхождениями.
Доброе время суток Михаил Л, коллега, а не проще ли?
Код
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
Андрей VG, Круто, спасибо, получается, грубо говоря мы добавляем колонку по определенному условию, а в качестве значения колонки берем NestedJoin. Спасибо, есть над чем подумать, я почему-то полностью начал игнорировать NestedJoin, не однократно на форуме видел сообщения о том, что он медленнее чем Join. Но в данном случае, это явно удобнее. Спасибо.
Да, спасибо за замечание - упустил. lostandleft, по моему вы меня перепутали с Михаил Л. Я не предлагал использовать NestedJoin. Какое из решений будет быстрее - надо тестировать.
Андрей VG написал: Какое из решений будет быстрее - надо тестировать
Я как понимаю, в моем варианте выполняются оба соединения и после по условию выбирается нужный. В вашем варианте по условию выбирается нужное соединение и выполняется только единственное нужное соединение. Как то так А Table.Join не прикручивается
Михаил Л, Я тоже так понял, изюминка именно в том, чтобы сначал обработать условие а уже после делать тот join который требуется. И в этом вся крутость. Это будет явно быстрее, чем обрабатывать кучу join потом выбирать результаты, фильтровать их и так далее. Спасибо господа, думаю это многим пригодится!
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}"