其实,这是过于复杂了第一电源查询体验。
如果这就是你必须要做的,那就这样吧,但是你应该意识到你是从一项相当困难的任务开始的。
小细节:我预计最后的Final_Item为10.10。根据该示例,如果Alt_Item为空,则Final_Item将为空。如果这是不正确的,那么这将是您调整以下代码的不错的第一步。
您可以创建一个新的空白查询,在高级编辑器中复制并粘贴此代码(替换默认代码),并将Source调整为您的表名称。
let
Source = Table.Buffer(Table1),
AddedFinal_Item =
Table.AddColumn(
Source,
"Final_Item",
each if [Alt_Item] = null
then null
else List.Last(
List.Generate(
() => [Final_Item = [Alt_Item], Continue = true],
each [Continue],
each [Final_Item =
Table.First(
Table.SelectRows(
Source,
(x) => x[Orig_Item] = [Final_Item]),
[Alt_Item = "not found"]
)[Alt_Item],
Continue = Final_Item <> "not found"],
each [Final_Item])))
in
AddedFinal_Item
该代码使用功能List.Generate执行循环。 由于性能原因,在调用List.Generate之前,应始终将表缓存在内存中(Table.Buffer)。
List.Generate是最复杂的Power Query函数之一。
它需要4个参数,每个参数本身就是一个函数。
在这种情况下,第一个参数以()开头,其他3个(每个都应该清楚):它们是对齐的)。
参数1定义了初始值:一个包含字段Final_Item和Continue的记录。
参数2是继续的条件:如果找到一个项目。
参数3是每次迭代中的实际转换:Source Table中搜索(与Table.SelectRows)的Orig_Item等于Alt_Item。这包裹在Table.First中,它返回第一条记录(如果找到的话),如果没有找到,则接受默认值,在这种情况下,记录的字段为Alt_Item,值为“not found”,根据此结果记录字段的值返回[Alt_Item],它是第一条记录的值,或者是默认值中的“not found”。
如果该值为“未找到”,则继续变成假并且迭代将停止。
参数4是将返回的值:Final_Item。
List.Generate返回每次迭代中所有值的列表。只有最后一个值是必需的,所以List.Generate包装在List.Last中。
最后说明:Power Query中很少需要实际循环,我认为应该尽可能避免实际循环。然而,在这种情况下,这是一个可行的解决方案,因为您事先不知道将会遇到多少个Alt_Items。 List.Generate的替代方法是使用索引函数。 也List.Accumulate接近循环,但它有一个固定的迭代次数。
非常感谢您的详细解释,我会在周末考察一下。 初学者的任何提示? – BrunoR
再次感谢您的解释,昨晚通过尝试结束。这需要一段时间,尽管这是因为桌子上有大约2000条线条,所以我让它在一夜之间思考。当我今天醒来时,它仍在想。停下来,再试一次,它仍然在继续。有这么长时间的任何理由?先进的谢谢你。 – BrunoR
看过之后,我意识到问题在于list.last。有什么想法吗? – BrunoR