Power Query中Text.Combine循环引用错误:求Power BI计算列等价表达式
Power Query实现Power BI计算列的匹配功能(解决循环引用错误)
需求说明
在Table1中新增一列,检查Table1[Column1.words]是否包含Table2[US_english]中的词汇,匹配时返回对应的US_english值。原Power BI计算列的DAX代码如下:
= MINX ( FILTER ( Table2, SEARCH ( Table2[US_english], Table1[Column1.words],, 0 ) > 0 ), Table2[US_english] )
注:原DAX逻辑是返回所有匹配词汇中最小的那个(通过MINX取最小值)
遇到的问题
自行编写的Power Query代码触发循环引用错误:Expression.Error: 计算期间遇到循环引用错误,代码如下:
let x= Table.AddColumn(Table1, "Column2.matched", each Text.Combine(List.Select(Table2[US_english], (x) => Text.Contains([Column1.words], x)),",")) in x
错误原因
代码里的变量名冲突:let语句定义的变量x和List.Select里的参数(x)重名,导致Power Query误判为循环引用。
解决方案
方案1:匹配所有词汇并合并(对应你写的合并逻辑)
修改参数名避免冲突,同时保证上下文正确:
let 添加匹配列 = Table.AddColumn(Table1, "Column2.matched", each Text.Combine( List.Select(Table2[US_english], (匹配词) => Text.Contains([Column1.words], 匹配词)), "," ) ) in 添加匹配列
方案2:完全等价原DAX逻辑(返回最小匹配词汇)
如果要和原DAX的MINX逻辑完全一致,返回所有匹配词汇中的最小值,用这段代码:
let 添加最小匹配列 = Table.AddColumn(Table1, "Column2.matched", each let 匹配词汇列表 = List.Select(Table2[US_english], (匹配词) => Text.Contains([Column1.words], 匹配词)) in if List.IsEmpty(匹配词汇列表) then null else List.Min(匹配词汇列表) ) in 添加最小匹配列
额外说明
Text.Contains默认区分大小写,要是需要不区分大小写,可添加第三个参数:Text.Contains([Column1.words], 匹配词, Comparer.OrdinalIgnoreCase)- 原DAX的
SEARCH同样区分大小写,若要保持逻辑一致,无需修改;若要统一不区分,两边的判断逻辑都要调整
内容的提问来源于stack exchange,提问作者21200506
相关产品推荐
相关产品推荐

