如何为列中每行生成上一个匹配项的索引(忽略空值)
实现非空条目上一个匹配实例的索引数组
需求概述
生成动态数组,存储列中每个非空条目对应的上一个相同值的索引,空条目返回空值。
现有公式(可运行但繁琐)
=LET(s,SEQUENCE(ROWS($E$4#)),BYROW(s,LAMBDA(r,LET(b,INDEX($E$4#,r),IF(b<>"",XMATCH(1,(s<r)*($E$4#=b),,-1),"")))))
简化实现方案
方案1:MAP + XMATCH(推荐,简洁高效)
利用XMATCH的反向搜索特性,直接限定搜索范围为当前行之前的区域,无需构建辅助布尔数组:
=MAP($E$4#,SEQUENCE(ROWS($E$4#)),LAMBDA(val,row_num, IF(val="","",XMATCH(val,$E$4#,,,-1,row_num-1)) ))
说明
MAP遍历每个值和对应行号,逻辑更直白XMATCH的-1参数表示从后往前搜索,row_num-1限定只搜索当前行之前的内容,直接返回上一个匹配的索引
方案2:SCAN 累积追踪(适合理解状态维护逻辑)
通过SCAN维护每个值的最后出现索引,逐行生成结果:
=LET(rng,$E$4#, seq,SEQUENCE(ROWS(rng)), result,SCAN(,seq,LAMBDA(acc,row, LET(val,INDEX(rng,row), IF(val="","", LET(last_idx,XLOOKUP(val,INDEX(rng,1:row-1),seq,,-1,2), HSTACK(acc,last_idx) ) ) ) )), DROP(result,,1) )
内容的提问来源于stack exchange,提问作者Zaphod Beeblebrox
相关产品推荐
相关产品推荐

