Tableau数据源建立及17万条记录
Datasource Establishment in Tableau and 170,000 records
我有两个 EXCEL 数据源。 175,000 行。我正在尝试使用两个数据源之间的 INNER 选项设置连接(添加新连接子句)。左侧数据源包括某些成员 ID #s。不幸的是,正确的数据源的成员 id #s 在一个名为 member Desc 的大字段中。如下所示,
左侧数据源
会员编号#
ALL89098
数据源权限
会员描述
YTRNNN TO=ALL89098_KIA 是或不是 或
POALL89098 乔
所以,正如您从上面注意到的那样,我需要处理两种情况。成员 ID 在 TO= 之后的 Member Desc 中,它可以在任何地方,如场景 2 POALL89098
如果我无法在 Tableau 中完成此操作以在来自不同数据源的这两列之间建立连接,因为我已将这两个数据源加载到 SQL 服务器数据库中,我可以 运行 SQL SQL 中的语句,因为它们也在 SQL 服务器数据库中的两个不同表中。
我正在尝试在 Tableau 中使用 CONTAINS 子句,如下所示,但它 运行 非常非常慢。它只是具有 16 GB Ram 的 Tableau Desktop。
if contains([Member Desc],([Member id #])则
[会员ID #]
别的
"NOT FOUND"
结束
非常感谢您的宝贵时间。
那么,有没有办法在 IF AND ELSE 或 CASE 语句中包含正则表达式?
我认为您将不得不找到一种方法从 SQL 中的成员 desc 中删除成员 ID。会员 ID 应该有某种模式。
例如,它总是 3 个字母后跟 5 个数字或类似的东西。
如果你能想出一个模式,那么你可以使用 SQL 和 Substring、Charindex、and/or 的一些组合,比如 %Text% 或正则表达式
在将 SQL 服务器 table 中的实际成员 ID 作为其自己的字段带入 Tableau 之前删除的模式。
您可以创建连接计算。突出显示的下拉列表显示了在哪里可以找到它:
只要[Member Desc]中Member ID的格式有一定规律,就可以用Regex提取出来。正如您在问题中提到的,ID 可能出现的一种方式是在 "TO=" 之后,它看起来像是在“_”之前结束。以下正则表达式计算字段将拉取两者之间的字符串:
REGEXP_EXTRACT([Member Desc],"([^TO=]*)(?=_)")
结果应正确连接两个数据源:
以上是一个大纲,我希望它能让你走上正确的道路。我意识到 [Member ID] 可能有几种不同的显示方式,所以我无法确定确切的正则表达式,但如果有任何模式,那么上面的格式应该可以工作。 (即:即使唯一的模式是 [会员 ID] 是三个字母后跟四个数字 - 或者它总是以 A 开头并以其他内容结尾 - 等等)
正则表达式也应该比 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 语句,因为 Inner Join 会自动排除它。
编辑回复评论:
谢谢你。我看到了你的建议。
我有两个 EXCEL 数据源。 175,000 行。我正在尝试使用两个数据源之间的 INNER 选项设置连接(添加新连接子句)。左侧数据源包括某些成员 ID #s。不幸的是,正确的数据源的成员 id #s 在一个名为 member Desc 的大字段中。如下所示,
左侧数据源 会员编号# ALL89098
数据源权限 会员描述 YTRNNN TO=ALL89098_KIA 是或不是 或 POALL89098 乔
所以,正如您从上面注意到的那样,我需要处理两种情况。成员 ID 在 TO= 之后的 Member Desc 中,它可以在任何地方,如场景 2 POALL89098
如果我无法在 Tableau 中完成此操作以在来自不同数据源的这两列之间建立连接,因为我已将这两个数据源加载到 SQL 服务器数据库中,我可以 运行 SQL SQL 中的语句,因为它们也在 SQL 服务器数据库中的两个不同表中。
我正在尝试在 Tableau 中使用 CONTAINS 子句,如下所示,但它 运行 非常非常慢。它只是具有 16 GB Ram 的 Tableau Desktop。
if contains([Member Desc],([Member id #])则 [会员ID #] 别的 "NOT FOUND" 结束
非常感谢您的宝贵时间。
那么,有没有办法在 IF AND ELSE 或 CASE 语句中包含正则表达式?
我认为您将不得不找到一种方法从 SQL 中的成员 desc 中删除成员 ID。会员 ID 应该有某种模式。 例如,它总是 3 个字母后跟 5 个数字或类似的东西。 如果你能想出一个模式,那么你可以使用 SQL 和 Substring、Charindex、and/or 的一些组合,比如 %Text% 或正则表达式 在将 SQL 服务器 table 中的实际成员 ID 作为其自己的字段带入 Tableau 之前删除的模式。
您可以创建连接计算。突出显示的下拉列表显示了在哪里可以找到它:
只要[Member Desc]中Member ID的格式有一定规律,就可以用Regex提取出来。正如您在问题中提到的,ID 可能出现的一种方式是在 "TO=" 之后,它看起来像是在“_”之前结束。以下正则表达式计算字段将拉取两者之间的字符串:
REGEXP_EXTRACT([Member Desc],"([^TO=]*)(?=_)")
结果应正确连接两个数据源:
以上是一个大纲,我希望它能让你走上正确的道路。我意识到 [Member ID] 可能有几种不同的显示方式,所以我无法确定确切的正则表达式,但如果有任何模式,那么上面的格式应该可以工作。 (即:即使唯一的模式是 [会员 ID] 是三个字母后跟四个数字 - 或者它总是以 A 开头并以其他内容结尾 - 等等)
正则表达式也应该比 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 语句,因为 Inner Join 会自动排除它。
编辑回复评论: 谢谢你。我看到了你的建议。