Power Query - 合并查询 returns true or false
Power Query - Merge queries returns true or false
我想知道如果 2 个查询之间的合并是否匹配数据,M 语言是否可以 return 仅判断真或假?
或多或少,类似于Excel中ISNA函数的函数VLOOKUP
谢谢
我认为这可能会提供你想要的,特别是使用合并:
如果我从来自两个不同查询的两个 table 开始(我的查询名为 Query1 和 Query2):
如果我想查看 Query2 中的哪些不在 Query1 中,我单击“主页”>“合并查询”>,然后像这样设置对话框并单击“确定”:
这给了我这个:
然后我通过单击列右上角的 展开 Query2 列中的 tables 以获取此内容:
然后我点击公式栏左侧的,在公式栏中输入= Table.TransformColumns(#"Expanded Query2", {"Column1.1", each if _ = null then false else true})
,然后点击回车得到这个:
(如果您查看屏幕右侧,在 Applied Steps 下,您会看到 Expanded Query2 是上一步。每个步骤也恰好是 table 状态,就像查询结果是 table 状态。您可以将这些 table 状态用作 tables,就像您将查询结果用作 tables...因为它们基本上是 tables。此代码从之前的 table 状态转换列。此外,如果您没有看到公式栏,请单击“查看”选项卡并选中公式栏框。)
*****在@Frederic Le Guen 的评论后添加*****
这里有一个更直接的方法List.Contains,可能更符合您的要求。
从与上面相同的两个查询中的相同两个 table 开始,查询名为 Query1 和 Query1 和 Query2:
进入 Query1 并向其添加一列 - 添加列 > 自定义列 - 并像这样设置它:
然后单击“确定”。
你会得到这个:
假设我想检查此 table ("firstTable"
) 中的值:
存在于此table下方("secondTable"
):
方法一
如果您只想检查是否存在(而不是实际执行合并),那么这可能是一种方法:
let
firstTable = Table.FromColumns({List.Numbers(1,10,1)}, type table [column A=Int64.Type]),
secondTable = Table.FromColumns({List.Numbers(1,10,2)}, type table [column B=Int64.Type]),
check = Table.AddColumn(firstTable, "Is column A in column B?", each Table.Contains(secondTable, [column B = [column A]]), type logical)
in
check
方法二
类似但更详细的方法可能是:
let
firstTable = Table.FromColumns({List.Numbers(1,10,1)}, type table [column A=Int64.Type]),
secondTable = Table.FromColumns({List.Numbers(1,10,2)}, type table [column B=Int64.Type]),
check = Table.AddColumn(firstTable, "Is column A in column B?", each let colA = [column A], lookup = Table.MatchesAnyRows(secondTable, each [column B] = colA) in lookup, type logical)
in
check
方法 3
此方法将实际执行合并,然后检查每个 merged/joined table 是否包含任何行。我想它会比其他的慢(理论上它会尝试 merge/match 所有行并且不会在找到一个匹配项后立即退出),但我可能是错的,这取决于 Table.Join
的内部实现。
let
firstTable = Table.FromColumns({List.Numbers(1,10,1)}, type table [column A=Int64.Type]),
secondTable = Table.FromColumns({List.Numbers(1,10,2)}, type table [column B=Int64.Type]),
merged = Table.NestedJoin(firstTable, {"column A"}, secondTable, {"column B"}, "Is column A in the second table?", JoinKind.LeftOuter),
isEmpty = Table.TransformColumns(merged, {{"Is column A in the second table?", Table.IsEmpty, type logical}})
in
isEmpty
我已经给出了三种方法,因为你没有展示你的 data/example。很难建议什么会奏效。但希望您可以尝试使用它们,其中之一将是 useful/performant 适合您的数据大小。
请注意,前两行(每个 M
片段的)只是为了创建一些虚拟 tables firstTable
和 secondTable
.
我想知道如果 2 个查询之间的合并是否匹配数据,M 语言是否可以 return 仅判断真或假?
或多或少,类似于Excel中ISNA函数的函数VLOOKUP
谢谢
我认为这可能会提供你想要的,特别是使用合并:
如果我从来自两个不同查询的两个 table 开始(我的查询名为 Query1 和 Query2):
如果我想查看 Query2 中的哪些不在 Query1 中,我单击“主页”>“合并查询”>,然后像这样设置对话框并单击“确定”:
这给了我这个:
然后我通过单击列右上角的
然后我点击公式栏左侧的= Table.TransformColumns(#"Expanded Query2", {"Column1.1", each if _ = null then false else true})
,然后点击回车得到这个:
(如果您查看屏幕右侧,在 Applied Steps 下,您会看到 Expanded Query2 是上一步。每个步骤也恰好是 table 状态,就像查询结果是 table 状态。您可以将这些 table 状态用作 tables,就像您将查询结果用作 tables...因为它们基本上是 tables。此代码从之前的 table 状态转换列。此外,如果您没有看到公式栏,请单击“查看”选项卡并选中公式栏框。)
*****在@Frederic Le Guen 的评论后添加*****
这里有一个更直接的方法List.Contains,可能更符合您的要求。
从与上面相同的两个查询中的相同两个 table 开始,查询名为 Query1 和 Query1 和 Query2:
进入 Query1 并向其添加一列 - 添加列 > 自定义列 - 并像这样设置它:
然后单击“确定”。
你会得到这个:
假设我想检查此 table ("firstTable"
) 中的值:
存在于此table下方("secondTable"
):
方法一
如果您只想检查是否存在(而不是实际执行合并),那么这可能是一种方法:
let
firstTable = Table.FromColumns({List.Numbers(1,10,1)}, type table [column A=Int64.Type]),
secondTable = Table.FromColumns({List.Numbers(1,10,2)}, type table [column B=Int64.Type]),
check = Table.AddColumn(firstTable, "Is column A in column B?", each Table.Contains(secondTable, [column B = [column A]]), type logical)
in
check
方法二
类似但更详细的方法可能是:
let
firstTable = Table.FromColumns({List.Numbers(1,10,1)}, type table [column A=Int64.Type]),
secondTable = Table.FromColumns({List.Numbers(1,10,2)}, type table [column B=Int64.Type]),
check = Table.AddColumn(firstTable, "Is column A in column B?", each let colA = [column A], lookup = Table.MatchesAnyRows(secondTable, each [column B] = colA) in lookup, type logical)
in
check
方法 3
此方法将实际执行合并,然后检查每个 merged/joined table 是否包含任何行。我想它会比其他的慢(理论上它会尝试 merge/match 所有行并且不会在找到一个匹配项后立即退出),但我可能是错的,这取决于 Table.Join
的内部实现。
let
firstTable = Table.FromColumns({List.Numbers(1,10,1)}, type table [column A=Int64.Type]),
secondTable = Table.FromColumns({List.Numbers(1,10,2)}, type table [column B=Int64.Type]),
merged = Table.NestedJoin(firstTable, {"column A"}, secondTable, {"column B"}, "Is column A in the second table?", JoinKind.LeftOuter),
isEmpty = Table.TransformColumns(merged, {{"Is column A in the second table?", Table.IsEmpty, type logical}})
in
isEmpty
我已经给出了三种方法,因为你没有展示你的 data/example。很难建议什么会奏效。但希望您可以尝试使用它们,其中之一将是 useful/performant 适合您的数据大小。
请注意,前两行(每个 M
片段的)只是为了创建一些虚拟 tables firstTable
和 secondTable
.