我有两个EXCEL数据源。 175,000行。我正在尝试使用两个数据源之间的INNER选项设置联接(添加新联接子句)。左侧的数据源包含某些成员ID#。不幸的是,正确的数据源的成员ID号在一个称为成员Desc的大字段中。像下面这样
剩余数据源 会员ID# ALL89098
数据源权 会员说明 YTRNNN TO = ALL89098_KIA是否会或 PO ALL89098 JOE
因此,您需要从上面注意到,我需要处理两种情况。成员ID在TO =之后位于成员Desc中,并且它可以是场景2 POALL89098
如果无法在Tableau中完成此操作以在不同数据源中的这两列之间建立Join,则由于我已将这两个数据源均加载到SQL Server DB中,因此我可以在SQL中运行SQL语句,因为它们位于两个SQL Server DB中的不同表。
我正在尝试在Tableau中使用CONTAINS子句,如下所示,但运行速度非常慢。它只是具有16 GB Ram的Tableau Desktop。
如果包含([Member Desc],([[Member id#])then [会员ID #] 其他 “未找到” 结束
非常感谢您的宝贵时间。
那么,是否存在REGEXP(如果有其他陈述或案例陈述)之内?
答案 0 :(得分:1)
您可以创建联接计算。突出显示的下拉列表显示了可以找到的位置:
只要[Member Desc]中的Member ID格式具有某种模式,就可以使用正则表达式将其提取。正如您在问题中提到的那样,ID可能呈现的一种方式是在“ TO =”之后,并且看起来好像在“ _”之前结束。以下正则表达式计算字段将在两个之间拉出字符串:
REGEXP_EXTRACT([Member Desc],"([^TO=]*)(?=_)")
结果应正确合并两个数据源:
以上是概述,希望您能对您有所帮助。我意识到,[成员ID]可能会以几种不同的方法显示出来,因此我将无法确定确切的Regex,但是如果有任何模式,那么上面的格式应该可以使用。 (即:即使[会员ID]的唯一模式是三个字母后跟四个数字-或者它总是以A开头并以其他内容结尾-等等)
Regex还应该比contains()函数执行得更好,但是请注意,该函数确实需要搜索每一行中的每个字符串以进行联接。
根据评论进行编辑:
要添加多个条件,请尝试以下方法:
IF LEN(REGEXP_EXTRACT([Member Desc],"([^FROM=]*)(?=,)")) > 0
THEN REGEXP_EXTRACT([Member Desc],"([^FROM=]*)(?=,)")
ELSEIF LEN(REGEXP_EXTRACT([Member Desc],"([^TO=]*)(?=,)")) > 0
THEN REGEXP_EXTRACT([Member Desc],"([^TO=]*)(?=,)")
ELSEIF [...Put as many of these as might match your pattern]
THEN [...Put as many of these as might match your pattern]
END
本质上,计算是从列表中进行并尝试每种可能性。我稍微改变了一下,以查看返回值的长度(LEN()),该值应该比较快,因为它是整数。当此计算遍历每个ELSEIF并找到一个匹配项时,它将停止遍历列表-因此将最可能的匹配放在顶部很重要。计算字段的结果应为会员ID。如果没有匹配项,则实际上不需要ELSE语句,因为内部联接将自动排除它。
根据评论进行编辑: 谢谢。我看到你的建议。
答案 1 :(得分:0)
我认为您将必须找到一种从SQL中的成员desc中删除成员ID的方法。会员ID应该有某种模式。 例如,它总是3个字母,后跟5个数字或类似的数字。 如果可以提出一种模式,则可以使用SQL以及Substring,Charindex和/或Like%Text%或正则表达式的某种组合 模式,以将SQL Server表中的实际成员ID去除为自己的字段,然后再将其引入Tableau。