使用Loc Sorted进行跨表的精确匹配-还是其他工具?客户有兴趣在类似于VLOOKUP(excel)的列中设置公式。 该函数将产生与使用表联接相同的输出,但是客户有合理的理由使用公式而不是联接来执行此操作。
例如,他的基表可能如下所示:

第二个参考表可能是这样的:

我们可以将此公式分配给基表的“输出”列:
dtRefTable =数据表(“ RefTable”);
KeyBracket = Loc Sorted(dtRefTable:Key << getvalues,:Key);
dtRefTable:SpecificInfo [KeyBracket];
当公式执行时,它会将基本表更改为如下所示:

问题是在基表中,第2行的键是2401。 Ref Table中没有匹配2401,因此Loc Sorted向下取整并选择Key的下一个较低值(在本例中为Key = 2400),并选择111作为输出。
客户想要的是将该单元格(“输出”列,第2行)设置为“缺少”,或通过条件语句将其标识为“找不到匹配项”的任何其他值。 当然,这并不像说“如果Key = 2401将单元格设置为Missing”那样简单,因为在真实数据中存在许多匹配和不匹配的可能性。
小号 o理想的基本表如下所示:

我们如何做到这一点?是否有另一个函数(而不是Loc Sorted)可以跨这样的表工作?
谢谢,
杰瑞
回复:使用Loc Sorted进行跨表的精确匹配-还是其他工具?真好!感谢布雷迪,并感谢所有答复。 我认为客户会满意的。
JSL继续为我提供所有可用的功能。 我对“ Try”功能一无所知,也没有使用“ As List”。 非常酷,非常感谢!
杰瑞
回复:使用Loc Sorted进行跨表的精确匹配-还是其他工具?我更喜欢这个。更短更优雅。
回复:使用Loc Sorted进行跨表的精确匹配-还是其他工具?
这是另一种选择。
dt = Data Table( "reftable" );
Try( dt:specificInfo[Loc( As List( dt:key << getvalues ), :Key )[1]], . );
回复:使用Loc Sorted进行跨表的精确匹配-还是其他工具?只要“键”列中的值为数字,并且您已设置表引用变量,此方法就应该起作用。您在示例中使用的列引用在列公式中似乎不起作用。
KeyBracket = Loc(Column(dtRefTable,"Key") << getvalues == :Key);
If(N Row(KeyBracket > 0,
Column(dtRefTable,"SpecificInfo")[KeyBracket[1]],
.
);
不知道我对表公式中的代码的感觉如何。但是,它确实避免了遍历目标表中所有键值的麻烦。如果您的键值是字符,请在Loc命令中用逗号替换“ ==”并切换参数的顺序。
回复:使用Loc Sorted进行跨表的精确匹配-还是其他工具?是的-我的意思是您可以使用公式执行此操作... 如果存在表控制问题,那么更好的方法可能是涉及JMP表查询生成器。然后他们可以将标准化的工作流程另存为QB文件,并创建具有更新功能的表。QB的优点是代码已经由JMP格式化和构建。回复:使用Loc Sorted进行跨表的精确匹配-还是其他工具?联接(常规联接或虚拟联接)确实有效,我最初向客户推荐了它们。 但是,它们有一些内部需求(很多人访问安全数据文件-我不了解所有的来龙去脉),要求他们使用公式而不是联接来完成。 抱歉!
回复:使用Loc Sorted进行跨表的精确匹配-还是其他工具?我也建议这样做。请注意,在保存包含公式的表之前,请勿关闭引用的表。如果这样做,该公式将被删除!
回复:使用Loc Sorted进行跨表的精确匹配-还是其他工具?您尝试过虚拟联接吗?
中号