Tableau中的数据源建立和170,000条记录

时间:2019-03-05 21:29:25

标签: sql sql-server tableau tableau-online

我有两个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(如果有其他陈述或案例陈述)之内?

2 个答案:

答案 0 :(得分:1)

您可以创建联接计算。突出显示的下拉列表显示了可以找到的位置:

enter image description here

只要[Member Desc]中的Member ID格式具有某种模式,就可以使用正则表达式将其提取。正如您在问题中提到的那样,ID可能呈现的一种方式是在“ TO =”之后,并且看起来好像在“ _”之前结束。以下正则表达式计算字段将在两个之间拉出字符串:

REGEXP_EXTRACT([Member Desc],"([^TO=]*)(?=_)")

enter image description here

结果应正确合并两个数据源:

enter image description here

以上是概述,希望您能对您有所帮助。我意识到,[成员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。