@deadzlq 这个思路也很好,先在奖金[姓名]中做筛选,返回可做查询依据的MatchCol列,再用这列做查询,不过还有几点疑问:
- List.FirstN(奖金[姓名],3)是不是没有必要?是不是为了避免有个人就叫“其他”的这种情况?
- else "其他"不够灵活,如果奖金表中属性值变化了就不行了,比如写为了“其他人”,这条语句就得同时修改,是不是可以优化为else List.Last(奖金[姓名]),但是这样却也限定了其他情况必须放在奖金表的最后一行,否则就不行了,思来想去怎么都没有完美的解决办法
- 仔细想了想这样其实和我一开始的查询一次展开再替换null也差不多,都是把匹配不上的值做特殊处理,之后都得有二次查询之后再删除中间步骤列的一步,如果用if语句做处理的话,其实可以用好个函数进行判断,包括:
if List.Contains(奖金[姓名],[姓名])
if List.PositionOf(奖金[姓名],[姓名],Occurrence.First)<>-1
if Table.PositionOf(奖金,[姓名=[姓名]],Occurrence.First,"姓名")<>-1
还可以用List.Mode,这样可以省略if判断:
(x)=> List.Mode(List.Combine({{x[姓名]},奖金[姓名]}))
我又试了试List.FirstN、List.LastN、List.RemoveFirstN、List.RemoveLastN、List.Skip等函数,都不行,因为它们都没法设置匹配不到时返回特定值
不知这些方法的效率怎样,哪种方法最好