使用Power Query模拟Excel公式遇到问题求助
解决Power Query中模拟Excel跨行列判断的问题
你的核心需求是在Power Query中实现Excel公式=IF(E4>D2, "BISI","")下拉后的逻辑:当前行的Low值大于往上数2行的High值时,标记"BISI",否则返回空值。原代码的问题在于重复创建索引列、索引计算错误,以下是正确的实现方案:
方案1:基于索引列的逐行判断(易理解)
先一次性给表格添加索引列,再在自定义列中利用索引定位目标行:
// 假设你的前期数据处理步骤名为"Changed Type" #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 1, 1, Int64.Type), #"Added BISI Flag" = Table.AddColumn(#"Added Index", "BISI", each // 对应Excel第4行及以后(索引>=4)才执行判断,前3行返回null if [Index] >= 4 then if [Low] > #"Added Index"{[Index]-2}[High] then "BISI" else null else null )
原代码错误分析
- 重复创建索引列:每次判断都调用
Table.AddIndexColumn会生成独立表格,不仅效率极低,还可能导致索引不匹配 - 索引计算错误:原代码中
[Index]-3的偏移量不符合Excel公式的逻辑(Excel是当前行减2行,对应索引减2)
方案2:基于列表偏移的高效实现(适合大数据量)
如果数据量较大,逐行引用表格行的效率较低,可以用列表偏移的方式优化:
#"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1, Int64.Type), // 提取High列的原始列表,前面补2个null实现偏移 highShifted = List.Combine({ {null, null}, Table.Column(#"Added Index", "High") }), #"Added BISI Flag" = Table.AddColumn(#"Added Index", "BISI", each // 索引>=2对应Excel第3行及以后,若要和Excel从H4开始一致,改为[Index] >=3 if [Index] >= 2 then if [Low] > highShifted{[Index]} then "BISI" else null else null )
这种方式通过列表预处理实现行偏移,避免了逐行查找表格的开销,刷新速度更快。
内容的提问来源于stack exchange,提问作者KoachR
相关产品推荐
相关产品推荐

