【问题标题】:Datasource Establishment in Tableau and 170,000 recordsTableau 中的数据源建立和 170,000 条记录
【发布时间】:2019-03-08 01:10:21
【问题描述】:

我有两个 EXCEL 数据源。 175,000 行。我正在尝试使用两个数据源之间的 INNER 选项设置连接(添加新连接子句)。左侧数据源包括某些成员 id #s。不幸的是,正确的数据源的成员 id #s 位于一个名为 member Desc 的大字段中。像下面这样,

左侧数据源 会员 ID # ALL89098

数据源权限 会员描述 YTRNNN TO=ALL89098_KIA 成为或不是 或 POALL89098 JOE

所以,我需要处理您从上面注意到的两种情况。成员 ID 在 TO= 之后的 Member Desc 中,它可以是场景 2 POALL89098 之类的任何地方

如果我无法在 Tableau 中完成此操作以在来自不同数据源的这两个列之间建立连接,因为我将这两个数据源都加载到 SQL Server DB 中,我可以在 SQL 中运行 SQL 语句,因为它们在两个SQL Server DB 中的不同表也是如此。

我正在尝试在 Tableau 中使用 CONTAINS 子句,如下所示,但它运行非常缓慢。它只是具有 16 GB 内存的 Tableau Desktop。

if contains([Member Desc],([Member id #])then [会员ID #] 别的 “未找到” 结束

非常感谢您抽出宝贵时间。

那么,有没有办法在 IF 和 ELSE 或 CASE 语句中使用正则表达式?

【问题讨论】:

  • 您说您的数据源是 Excel,但您使用 Sql Server 标记了问题。 SQL Server 在哪里适合所有这些?

标签: sql sql-server tableau-api


【解决方案1】:

您可以创建连接计算。突出显示的下拉菜单显示了可以找到它的位置:

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

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

结果应该正确连接两个数据源:

以上是一个大纲,希望能让你走上正确的道路。我意识到可能有几种不同的方法可以显示 [Member ID],所以我无法确定确切的正则表达式,但如果有任何模式,那么上面的格式应该可以工作。 (即:即使唯一的模式是 [Member 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 语句,因为 Inner Join 会自动排除它。

根据评论进行编辑: 谢谢你。我看到了你的建议。

【讨论】:

  • 所以,如果我需要把它放在像下面这样的多个条件下,你知道sentix是如何工作的吗?例如使用 if 和 else 条件。如果 REGEXP_EXTRACT([Member Desc],"([^FROM=]*)(?=,)") "0"则 REGEXP_EXTRACT([Member Desc],"([^TO=]*)(?=, )") 否则 "未找到" END
  • 查看编辑以回答希望回答您的问题。我认为您在那里接近正确答案,但我更改了您的 IF 部分以包含 LEN() 作为条件运算符。我还删除了 ELSE 子句,只是因为如果找不到任何内容,Inner Join 将为您执行此操作。
  • 谢谢。我为此目的使用了案例声明并且工作正常。
【解决方案2】:

我认为您将不得不找到一种方法从 SQL 中的成员描述中删除成员 ID。成员 ID 应该有一些模式。 例如,它总是 3 个字母后跟 5 个数字或类似的东西。 如果你能想出一个模式,那么你可以使用 SQL 和 Substring、Charindex 和/或 Like %Text% 或正则表达式的某种组合 模式将 SQL Server 表中的实际成员 ID 作为自己的字段剥离,然后再将其引入 Tableau。

【讨论】:

  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
相关资源
最近更新 更多