2017-08-23 152 views
0

首先我对电源查询很陌生,所以我正在迈出第一步。但我需要尝试在工作中提供一些时间,这样我才能获得一些呼吸时间来学习。Power Query M循环表

我有如下表(例如):

Orig_Item  Alt_Item  
5.7    5.10 
79.19   79.60 
79.60   79.86 
10.10   

,我需要创建一个列会循环表并显示最终Alt_Item。因此,结果将是以下几点:

Orig_Item  Alt_Item  Final_Item 
5.7    5.10   5.10  
79.19   79.60   79.86 
79.60   79.86   79.86 
10.10   

非常感谢

回答

1

其实,这是过于复杂了第一电源查询体验。

如果这就是你必须要做的,那就这样吧,但是你应该意识到你是从一项相当困难的任务开始的。

小细节:我预计最后的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接近循环,但它有一个固定的迭代次数。

+0

非常感谢您的详细解释,我会在周末考察一下。 初学者的任何提示? – BrunoR

+0

再次感谢您的解释,昨晚通过尝试结束。这需要一段时间,尽管这是因为桌子上有大约2000条线条,所以我让它在一夜之间思考。当我今天醒来时,它仍在想。停下来,再试一次,它仍然在继续。有这么长时间的任何理由?先进的谢谢你。 – BrunoR

+0

看过之后,我意识到问题在于list.last。有什么想法吗? – BrunoR

相关问题