【发布时间】:2019-03-09 09:55:13
【问题描述】:
我想知道如果 2 个查询之间的合并匹配数据,M 语言是否可以只返回 True 或 False ?
或多或少,类似于 Excel 中用于函数 VLOOKUP 的 ISNA 函数
谢谢
【问题讨论】:
-
您的更广泛目标是什么?也就是说,你用真假信息做什么?
标签: merge powerquery m
我想知道如果 2 个查询之间的合并匹配数据,M 语言是否可以只返回 True 或 False ?
或多或少,类似于 Excel 中用于函数 VLOOKUP 的 ISNA 函数
谢谢
【问题讨论】:
标签: merge powerquery m
我认为这可能会提供您想要的,特别是使用合并:
如果我从来自两个不同查询的两个表开始(我的查询名为 Query1 和 Query2):
如果我想查看哪些 Query2 不在 Query1 中,我点击 Home > Merge Queries > 然后我设置这样的对话框并点击 OK:
这给了我这个:
然后我通过单击列右上角的来展开 Query2 列中的表以获得以下信息:
然后我点击编辑栏左侧的,在编辑栏中输入= Table.TransformColumns(#"Expanded Query2", {"Column1.1", each if _ = null then false else true}),然后点击回车得到这个:
(如果您查看屏幕右侧的 Applied Steps 下方,您会看到 Expanded Query2 是上一步。每个步骤也恰好是一个表格状态,就像查询结果是表状态一样。您可以将这些表状态用作表,就像将查询结果用作表一样...因为它们基本上是表。此代码将列从先前的表状态转换。此外,如果您没有看到公式栏,请单击“查看”选项卡并选中“公式栏”框。)
*****在@Frederic Le Guen 的评论后添加*****
这是使用 List.Contains 的一种更直接的方式,它可能更符合您的要求。
从我上面所做的两个查询中的相同两个表开始,查询名为 Query1 和 Query1 和 Query2:
进入 Query1 并向其中添加一列 -- 添加列 > 自定义列 -- 并像这样设置它:
然后点击确定。
你会得到这个:
【讨论】:
List.IsEmpty(List.FindText(myList, "string")) 的函数,但它是一个非常慢的函数。所以我试图找到更好的方法
假设我想检查此表中的哪些值 ("firstTable"):
存在于下表中("secondTable"):
方法 1
如果您只想检查是否存在(而不是实际执行合并),那么这可能是一种方法:
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
方法 2
类似但更冗长的方法可能是:
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
这种方法实际上会执行合并,然后检查每个合并/连接的表是否包含任何行。我想它会比其他的慢(理论上它会尝试合并/匹配所有行并且一旦找到一个匹配项就不会退出),但我可能错了,这取决于Table.Join' s 内部实现。
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
我给出了三种方法,因为您没有展示您的数据/示例。很难建议什么会运作良好。但希望您可以尝试它们,其中一种对您的数据大小有用/有效。
注意前两行(每个M sn-p)只是为了创建一些虚拟表firstTable和secondTable。
【讨论】: