Power BI中比较连续行列值遇循环引用错误,求解决方案
解决Power Query中连续行比较的循环引用问题
错误原因分析
你遇到的Expression.Error : A cyclic reference was detected during the evaluation错误,核心原因有两点:
- 循环引用触发:添加列时直接引用了原始表
_Estimations(代码中Estimations是笔误),但当前操作的是经过过滤、添加索引、重排列后的#"Colonnes permutées"表,Power Query会将这种跨上下文的引用判定为循环。 - 索引不匹配:你添加的
Index列从1开始,但Power Query的列表索引是0基的,直接用[Index]取列表元素会导致位置偏移,甚至触发越界问题。
修正方案
方案一:基于当前表的索引调整列计算
替换原代码中最后一步的#"Personnalisée ajoutée1"步骤,改为引用当前处理的表,并修正索引偏移:
#"Personnalisée ajoutée1" = Table.AddColumn(#"Colonnes permutées", "Niveau arbre", let // 转换为0基索引 currentPos = [Index] - 1, nextPos = currentPos + 1, currentVal = #"Colonnes permutées"[Niveau num]{currentPos}, // 判断下一行是否存在,避免越界 nextVal = if nextPos < List.Count(#"Colonnes permutées"[Niveau num]) then #"Colonnes permutées"[Niveau num]{nextPos} else null in // 下一行存在时比较,否则返回0(可根据需求改为null) if nextVal <> null and currentVal > nextVal then 1 else 0, type number)
方案二:使用List.Skip批量生成比较结果(更高效)
通过提取列列表、与跳过首元素的列表对比,批量生成结果后添加到表中,适合数据量较大的场景:
let Source = Access.Database(File.Contents("C:\Users\T0275244\Desktop\BDD Access PBI\Off\BDD-Off.accdb"), [CreateNavigationProperties=true]), _Estimations = Source{[Schema="",Item="Estimations"]}[Data], #"Personnalisée ajoutée" = Table.AddColumn(_Estimations, "Niveau num", each List.Sum(List.Transform(Text.ToList([WBS]), each if _ = "." then 0 else 1))), #"Lignes filtrées" = Table.SelectRows(#"Personnalisée ajoutée", each [WBS] <> null and [WBS] <> ""), #"Type modifié" = Table.TransformColumnTypes(#"Lignes filtrées",{{"Niveau num", Int64.Type}}), #"Index ajouté" = Table.AddIndexColumn(#"Type modifié", "Index", 1, 1, Int64.Type), #"Colonnes permutées" = Table.ReorderColumns(#"Index ajouté",{"Devis", "WBS", "Désignation", "Qté", "Respde Lot niveau2", "Centre de taux", "Activity", "Activities", "ECPS/Transverse", "SW Comp", "MO ING", "MO TECH", "Total MO (H)", "Total MO (K€)", "Autres MO", "Total MO et Autre MO", "Total tarifs (PRV)", "Divers CPP", "Total MO et Div Tarifs", "Durée ID Ingé", "Nb de Voyages", "Divers transports", "Total Frais Déplacement", "INTRAGROUP PURCHASES", "EXTERNAL PURCHASES", "Total DEVIS (non inflaté)", "Commentaires", "Options", "Devis(Devis)", "Index", "Niveau num"}), // 提取Niveau num列的列表 niveauList = #"Colonnes permutées"[Niveau num], // 生成连续行比较的结果列表 compareResults = List.Zip({niveauList, List.Skip(niveauList, 1)}) |> List.Transform( (x) => if x{0} > x{1} then 1 else 0 ) // 给最后一行添加默认值(无下一行,这里设为0) |> List.Append({0}), // 将结果列表添加为新列 #"Personnalisée ajoutée1" = Table.FromColumns( Table.ToColumns(#"Colonnes permutées") & {compareResults}, Table.ColumnNames(#"Colonnes permutées") & {"Niveau arbre"} ) in #"Personnalisée ajoutée1"
关键说明
- 两种方案均避免了引用原始表,而是基于当前处理的
#"Colonnes permutées"表进行计算,彻底解决循环引用问题。 - 方案二通过批量列表操作替代逐行计算,性能更优,尤其是数据量较大时。
内容的提问来源于stack exchange,提问作者Clémence
相关产品推荐
相关产品推荐

