Power BI中为80000行数据添加前值列时加载卡顿问题求助
解决Power Query中添加前一行数据时Close&Apply卡顿的问题
你的问题我太熟悉了——预览时看起来一切正常,一点击Close&Apply就直接卡死,哪怕数据量不算特别大对吧?问题出在你用的公式上:
try #"Added Custom" { [Index] -1 } [Action Type] otherwise null
这种逐行通过索引查找前一行的方式,在Power Query里是性能杀手。原理很简单:每一行都要去整个数据表中定位对应的索引行,8万行的话就会执行8万次全表查找,时间复杂度直接拉到O(n²),哪怕电脑性能不错也顶不住这种重复计算。而预览模式只加载前几百行,所以你根本察觉不到问题。
下面给你两个高效的解决方案,都是O(n)级别的批量操作,处理8万行完全不在话下:
方案1:基于列表的快速匹配(最简洁高效)
这种方法直接把Action Type转成列表,然后生成一个"偏移一行"的列表,再把这个列表作为新列添加回去:
let Source = 你的数据源, // 替换成你实际的数据源步骤 // 提取Action Type列的所有值为列表 Action_List = Source[Action Type], // 生成前一行的列表:去掉原列表第一个元素,最后补一个null(第一行没有前一行) Prev_Action_List = List.RemoveFirstN(Action_List, 1) & {null}, // 将原表和新列表合并成新表 Added_Prev_Action = Table.FromColumns( Table.ToColumns(Source) & {Prev_Action_List}, Table.ColumnNames(Source) & {"Prev Action Type"} // 新列名可以自定义 ) in Added_Prev_Action
方案2:左连接辅助表(更直观,适合需要保留索引的场景)
如果你的表已经有索引列,或者需要保留索引用于其他操作,可以用左连接的方式批量匹配前一行:
let Source = 你的数据源, // 替换成你实际的数据源步骤 // 添加连续索引列(如果还没有的话) Added_Index = Table.AddIndexColumn(Source, "Index", 0, 1, Int64.Type), // 创建辅助表:索引+1,并重命名Action Type为前一行的列名 Prev_Table = Table.RenameColumns( Table.AddColumn(Added_Index, "Prev_Index", each [Index] + 1), {"Action Type", "Prev Action Type"} ), // 辅助表只保留需要匹配的列 Clean_Prev_Table = Table.SelectColumns(Prev_Table, {"Prev_Index", "Prev Action Type"}), // 原表和辅助表左连接,匹配Index和Prev_Index Joined_Table = Table.Join(Added_Index, "Index", Clean_Prev_Table, "Prev_Index", JoinKind.LeftOuter), // 移除不需要的索引列 Final_Table = Table.RemoveColumns(Joined_Table, {"Index", "Prev_Index"}) in Final_Table
这两种方法都是一次性处理所有行,不会像你原来的公式那样逐行扫描全表,执行Close&Apply的时候速度会快很多,8万行基本几秒就能完成。
内容的提问来源于stack exchange,提问作者Mateusz P
相关产品推荐
相关产品推荐

