相关文章推荐
小百科
›
Tableau 中创建计算的最佳做法 - Tableau
calc
tableau
正直的钥匙扣
6 月前
</noscript><div id="app" class="wrapper"><header id="tableau-help-article-header" class="container--full-width quick-help-header"><div class="container--centered"><div class="header__mobile-menu quick-help-hidden"><menu-tree-toggle/></div><div class="header__logo quick-help-hidden"><a id="tableau-logo" href="https://www.tableau.com/zh-cn/"><img src="./Resources/tableau-logo.png" class="header__logo__img" alt="Tableau"/></a></div><div class="header__search"><search-header-help placeholder="搜索"/></div></div></header><div class="container--navigation-top quick-help-hidden content-only-hidden"><div id="help-subheader" class="subheader print-hidden"><div class="container--centered"><h1 class="heading--subheader">Tableau Desktop 和 Web 制作帮助</h1></div></div><div class="container--top-links"><div class="container--centered container--breadcrumbs"><div><breadcrumb-links-help/></div></div><div id="help-container-menu-headings" class="container--menu-headings"><nav class="nav-medium-screen"><menu-heading-links-static-help menu-title="本文内容" :disabled="false" :headings="pageHeadings"/></nav></div></div></div><div class="section--main container--full-width"><div class="container--centered"><nav class="nav-side nav-side--left" role="navigation"><menu-tree-help menu-title="内容"/></nav><article role="main"><h2 class="topic--title" id="topic-title">Tableau 中创建计算的最佳做法</h2><div class="caption article__tags content-only-hidden quick-help-hidden"><span class="article__tags--applies-to">适用于: Tableau Cloud, Tableau Desktop, Tableau Public, Tableau Server</span><br/><span class="article__tags--role"> </span></div><div id="content-body"> <div id="mc-main-content"><p>本文介绍在 Tableau 中创建高效计算的若干提示和准则。这些准则旨在帮助您优化工作簿性能。有关可提高工作簿性能的所有方式的详细信息,请参见<a href="performance_tips.htm" class="MCXref xref" xrefformat="{paratext}">优化工作簿性能</a>系列。</p><h2 is="heading-item" :level="2" id="一般规则:避免在另一个计算中使用某个计算字段多次">一般规则:避免在另一个计算中使用某个计算字段多次</h2><p>在另一个计算中引用同一计算字段多次将导致性能问题。如果您在计算内使用计算字段(也称为创建嵌套计算),请尝试只在计算中引用该计算字段一次。</p><p>请注意,在计算中引用某个字段(终端字段)多次应该不会使性能降级。</p><h3 is="heading-item" :level="3" id="示例">示例</h3><p>假设您创建一个计算字段,该字段使用复杂的多行计算在推文中查找提及(或推特用户名)。计算字段名为“Twitter Handle”(推特用户名)。返回的每个用户名以“@”符号开头(例如:@user)。</p><p>为了便于分析,您想要移除“@”符号。</p><p>为此,您可以使用以下计算来从字符串中移除第一个字符:</p><p class="example"><code>RIGHT([Twitter Handle], LEN([Twitter Handle]) -1)</code></p><p>此计算非常简单。但是,由于它引用了“Twitter Handle”(推特用户名)计算两次,因此会为数据源中的每条记录执行该计算两次:一次针对 RIGHT 函数执行,另一次针对 LEN 函数执行。</p><p>为了避免计算同一个计算多次,您可以将计算改写为只使用“Twitter Handle”(推特用户名)计算一次。在本例中,您可以使用 MID 来完成相同目标:</p><p class="example"><code>MID([Twitter Handle], 2)</code></p><h2 is="heading-item" :level="2" id="提示-1:将多个等式比较转换为-case-表达式或组">提示 1:将多个等式比较转换为 CASE 表达式或组</h2><p>假设您有以下计算,该计算使用计算字段“Person (calc)”多次,并使用一系列 OR 函数。此计算尽管是一个简单的逻辑表达式,但会导致查询性能问题,因为它会执行“Person (calc)”计算至少十次。</p><p class="example"><code>IF <span style="background-color: #ffd700;">[Person (calc)]</span> = 'Henry Wilson'<br/>OR <span style="background-color: #ffd700;">[Person (calc)]</span> = 'Jane Johnson'<br/>OR <span style="background-color: #ffd700;">[Person (calc)]</span> = 'Michelle Kim'<br/>OR <span style="background-color: #ffd700;">[Person (calc)]</span> = 'Fred Suzuki'<br/>OR <span style="background-color: #ffd700;">[Person (calc)]</span> = 'Alan Wang'<br/>THEN 'Lead'<br/>ELSEIF <span style="background-color: #ffd700;">[Person (calc)]</span> = 'Susan Nguyen'<br/>OR <span style="background-color: #ffd700;">[Person (calc)]</span> = 'Laura Rodriguez'<br/>OR <span style="background-color: #ffd700;">[Person (calc)]</span> = 'Ashley Garcia'<br/>OR <span style="background-color: #ffd700;">[Person (calc)]</span> = 'Andrew Smith'<br/>OR <span style="background-color: #ffd700;">[Person (calc)]</span> = 'Adam Davis'<br/>THEN 'IC'<br/>END</code></p><p>请尝试以下解决方案,而不是使用等式比较。</p><h3 is="heading-item" :level="3" id="解决方案-1">解决方案 1</h3><p>使用 CASE 表达式。例如:</p><p class="example"><code>CASE <span style="background-color: #ffd700;">[Person (calc)]</span><br/>WHEN 'Henry Wilson' THEN 'Lead'<br/>WHEN 'Jane Johnson' THEN 'Lead'<br/>WHEN 'Michelle Kim' THEN 'Lead'<br/>WHEN 'Fred Suzuki' THEN 'Lead'<br/>WHEN 'Alan Wang' THEN 'Lead'<br/><br/>WHEN 'Susan Nguyen' THEN 'IC'<br/>WHEN 'Laura Rodriguez' THEN 'IC'<br/>WHEN 'Ashley Garcia' THEN 'IC'<br/>WHEN 'Andrew Smith' THEN 'IC'<br/>WHEN 'Adam Davis' THEN 'IC'<br/>END</code></p><p>在本例中,只引用了计算字段“Person (calc)”一次。因此该计算也只会执行一次。CASE 表达式在查询管道中还得到了进一步优化,因此性能得以额外提升。</p><h3 is="heading-item" :level="3" id="解决方案-2">解决方案 2</h3><p>创建组,而不是计算字段。有关详细信息,请参见<a href="sortgroup_groups_creating.htm" class="MCXref xref" xrefformat="{paratext}">对数据进行分组</a>。</p><h2 is="heading-item" :level="2" id="提示-2:将多个字符串计算转换为单一-regexp-表达式">提示 2:将多个字符串计算转换为单一 REGEXP 表达式</h2><p class="note"><b>注意</b>:REGEXP 计算仅在使用 Tableau 数据提取或连接到文本文件、Hadoop Hive、Google BigQuery、PostgreSQL、Tableau 数据提取、Microsoft Excel、Salesforce、Vertica、Pivotal Greenplum、Teradata(版本 14.1 及更高版本)和 Oracle 数据源时可用。有关详细信息,请参见<a href="functions_functions_additional.htm" class="MCXref xref" xrefformat="{paratext}">其他函数</a>。</p><br/><h3 is="heading-item" :level="3" id="示例-1:contains">示例 1:CONTAINS</h3><p>假设您有以下计算,该计算使用计算字段“Category (calc)”多次。此计算尽管也是一个简单的逻辑表达式,但会导致查询性能问题,因为它会执行“Category (calc)”计算多次。</p><p class="example"><code>IF CONTAINS([Segment (calc)],'UNKNOWN')<br/>OR CONTAINS([Segment (calc)],'LEADER')<br/>OR CONTAINS([Segment (calc)],'ADVERTISING')<br/>OR CONTAINS([Segment (calc)],'CLOSED')<br/>OR CONTAINS([Segment (calc)],'COMPETITOR')<br/>OR CONTAINS([Segment (calc)],'REPEAT')<br/>THEN 'UNKNOWN'<br/>ELSE [Segment (calc)] END</code></p><p>您可以使用 REGEXP 表达式来获得同样的结果,而不必进行同样的重复。</p><h4>解决方案</h4><p class="example"><code>IF REGEXP_MATCH([Segment (calc)], 'UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT') THEN 'UNKNOWN'<br/>ELSE [Segment (calc)] END</code></p><br/><p>对于使用类似模式的字符串计算,您可以使用相同的 REGEXP 表达式。</p><h3 is="heading-item" :level="3" id="示例-2:startswith">示例 2:STARTSWITH</h3><p class="example"><code>IF STARTSWITH([Segment (calc)],'UNKNOWN')<br/>OR STARTSWITH([Segment (calc)],'LEADER')<br/>OR STARTSWITH([Segment (calc)],'ADVERTISING')<br/>OR STARTSWITH([Segment (calc)],'CLOSED')<br/>OR STARTSWITH([Segment (calc)],'COMPETITOR')<br/>OR STARTSWITH([Segment (calc)],'REPEAT')<br/>THEN 'UNKNOWN'</code></p><h4>解决方案</h4><p class="example"><code>IF REGEXP_MATCH([Segment (calc)], '<span style="background-color: #ffd700;">^</span>(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)') THEN 'UNKNOWN'<br/>ELSE [Segment (calc)] END</code></p><p>请注意,此解决方案中使用“^”符号。</p><h3 is="heading-item" :level="3" id="示例-3:endswith">示例 3:ENDSWITH</h3><p class="example"><code>IF ENDSWITH([Segment (calc)],'UNKNOWN')<br/>OR ENDSWITH([Segment (calc)],'LEADER')<br/>OR ENDSWITH([Segment (calc)],'ADVERTISING')<br/>OR ENDSWITH([Segment (calc)],'CLOSED')<br/>OR ENDSWITH([Segment (calc)],'COMPETITOR')<br/>OR ENDSWITH([Segment (calc)],'REPEAT')<br/>THEN 'UNKNOWN'<br/>ELSE [Segment (calc)] END</code></p><h4>解决方案</h4><p class="example"><code>IF REGEXP_MATCH([Segment (calc)], '(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)<span style="background-color: #ffd700;">$</span>') THEN 'UNKNOWN'<br/>ELSE [Segment (calc)] END</code></p><p>请注意,此解决方案中使用“$”符号。</p><h2 is="heading-item" :level="2" id="提示-3:使用-regexp(而不是-left、mid、right、find、len)操作字符串">提示 3:使用 REGEXP(而不是 LEFT、MID、RIGHT、FIND、LEN)操作字符串</h2><p>正则表达式可能是一种非常强大的工具。在执行复杂的字符串操作时,请考虑使用正则表达式。在许多情况下,使用正则表达式会使计算更加简短高效。有关正则表达式的详细信息,请参见 Tableau 博客上的 <a href="https://www.tableau.com/zh-cn/about/blog/2015/6/become-regular-regular-expressions-39802" target="_blank">Become a regex regular and wrangle imperfect data(成为正则表达式精英并照管不完美的数据)<span class="sr-only">(链接在新窗口中打开)</span></a>博文。</p><h3 is="heading-item" :level="3" id="示例-1">示例 1</h3><p>假设您有以下计算,该计算从 URL 中移除协议。例如:“https://www.tableau.com”变为“www.tableau.com”。</p><p class="example"><code>IF (STARTSWITH([Server], "http://")) THEN <br/>MID([Server], Len("http://") + 1)<br/>ELSEIF(STARTSWITH([Server], "https://")) THEN <br/>MID([Server], Len("https://") + 1)<br/>ELSEIF(STARTSWITH([Server], "tcp:")) THEN <br/>MID([Server], Len("tcp:") + 1)<br/>ELSEIF(STARTSWITH([Server], "\\")) THEN <br/>MID([Server], Len("\\") + 1)<br/>ELSE [Server]<br/>END</code></p><h4>解决方案</h4><p>可通过使用 REGEXP_REPLACE 函数来简化计算和提高性能。</p><p class="example"><code>REGEXP_REPLACE([Server], "^(http://|https://|tcp:|\\\\)", "")</code></p><h3 is="heading-item" :level="3" id="示例-2">示例 2</h3><p>假设您有以下计算,该计算返回 IPv4 地址的第二部分。例如:“172.16.0.1”变为“16”。</p><p class="example"><code>IF (FINDNTH([Server], ".", 2) > 0) THEN<br/>MID([Server],<br/>FIND([Server], ".") + 1,<br/>FINDNTH([Server], ".", 2) - FINDNTH([Server], ".", 1) - 1<br/>)<br/>END</code></p><h4>解决方案</h4><p>可通过使用 REGEXP_EXTRACT 函数来简化计算和提高性能。</p><p class="example"><code>REGEXP_EXTRACT([Server], "\.([^\.]*)\.")</code></p><h2 is="heading-item" :level="2" id="提示-4:不要在计算中使用集">提示 4:不要在计算中使用集</h2><p>如果在计算中使用集,请考虑将集替换为一个替代等效计算。</p><h3 is="heading-item" :level="3" id="示例1">示例</h3><p>假设您有以下计算,该计算使用集“Top Customers (set)”。</p><p class="example"><code>IF ISNULL([Customer Name]) OR <span style="background-color: #ffd700;">[Top customers (set)]</span> THEN [Segment] ELSE [Customer Name] END</code></p><h3 is="heading-item" :level="3" id="解决方案-11">解决方案 1</h3><p>如果集很简单,您可以创建一个其返回结果与集相同的计算字段。例如:</p><p class="example"><code>CASE [Customer Name]<br/>WHEN 'Henry Wilson' THEN True<br/>WHEN 'Jane Johnson' THEN True<br/>WHEN 'Michelle Kim' THEN True<br/>WHEN 'Fred Suzuki' THEN True<br/>WHEN 'Alan Wang' THEN True<br/>ELSE False<br/>END</code></p><br/><p><b>注意</b>:建议在此情况下使用模式 WHEN TRUE … ELSE,以避免由于使用集而导致的性能问题。大多数情况下不推荐使用该模式。</p><h3 is="heading-item" :level="3" id="解决方案-21">解决方案 2</h3><p>如果集比较复杂,请考虑创建一个组,该组将集中的所有元素映射到一个给定的值或属性(例如“IN”),然后修改计算来检查该值/属性。例如:</p><p class="example"><code>IF ISNULL([Customer Name]) OR <span style="background-color: #ffd700;">[Top Customers(group)]='IN'</span> THEN [Segment] ELSE [Customer Name] END</code></p><p>有关详细信息,请参见<a href="sortgroup_groups_creating.htm" class="MCXref xref" xrefformat="{paratext}">对数据进行分组</a>和<a href="sortgroup_sets_create.htm" class="MCXref xref" xrefformat="{paratext}">创建集</a>。</p><h2 is="heading-item" :level="2" id="提示-5:不要使用集对数据进行分组">提示 5:不要使用集对数据进行分组</h2><p>集旨在对数据的子集进行比较。组旨在将相关成员合并在一个字段中。不推荐将集转换为组,例如通过以下示例进行转换:</p><p class="example"><code>IF [Americas Set] THEN "Americas"<br/>ELSEIF [Africa Set] THEN "Africa"<br/>ELSEIF [Asia Set] THEN "Asia"<br/>ELSEIF [Europe Set] THEN "Europe"<br/>ELSEIF [Oceania Set] THEN "Oceania"<br/>ELSE "Unknown"<br/>END</code></p><p>之所以不推荐这样做,有以下几个原因:</p><ul><li><p><b>集并不始终是排他的。</b>某些成员可能会出现在多个集中。例如,“俄罗斯”既可能放在“欧洲”集中,也可能放在“亚洲”集中。</p></li><li><p><b>集并不会始终转换为组。</b>如果集是通过排除、条件或限制定义的,则可能很难甚至无法创建等效的组。</p></li></ul><h3 is="heading-item" :level="3" id="解决方案">解决方案</h3><p>使用“组”功能对数据进行分组。有关详细信息,请参见<a href="sortgroup_groups_creating.htm" class="MCXref xref" xrefformat="{paratext}">对数据进行分组</a>。</p><h2 is="heading-item" :level="2" id="另请参见">另请参见</h2><p><a href="perf_efficient_calcs.htm" class="MCXref xref" xrefformat="{paratext}">创建高效的计算</a></p><p><a href="performance_tips.htm" class="MCXref xref" xrefformat="{paratext}">优化工作簿性能</a></p><p><a href="calculations_calculatedfields_understand_types.htm" class="MCXref xref" xrefformat="{paratext}">Tableau 中的计算类型</a></p><p><a href="functions.htm" class="MCXref xref" xrefformat="{paratext}">Tableau 中的函数</a></p></div></div><div class="article__footer--back-to-top text--centered print-hidden quick-help-hidden"><a href="#" class="text--caps" onclick="setFocus()"><span class="icon--med icon--arrow-up"/> 回到顶部</a></div><feedback-form :disabled="false" class="print-hidden content-only-hidden" helpful-question="这篇文章解决了您的问题吗?" helpful-yes="是" helpful-no="否" comment-question="我们重视您的反馈。在此处添加注释。" submit-option="发送" cancel-option="取消" loading-text="正在发送..."><span slot="submittedMessage">感谢您的反馈!</span></feedback-form><d-s-c-feedback-form :disabled="false" class="print-hidden content-only-hidden quick-help-hidden" feedback-question="这篇文章解决了您的问题吗?" feedback-subtitle="让我们知道,这样我们才能改进!" helpful-yes="是" helpful-no="否" error-message="请至少选中 1 个复选框。" thanks-positive-feedback="感谢您的反馈!这篇文章对您有什么帮助?" thanks-negative-feedback="很遗憾听到这一点。我们如何改进这篇文章?" feedback-yes-accurate="包含准确的信息" feedback-yes-comprehensive="包括我需要的所有信息" feedback-yes-clear="易于理解,具有清晰的解释和视觉效果" feedback-no-accurate="包含不准确或过时的信息" feedback-no-comprehensive="缺少重要信息" feedback-no-clear="令人困惑或者难以理解" feedback-no-descriptive="这篇文章不错,但我不喜欢所描述的产品的工作方式" feedback-something-else=" 其他" additional-feedback="您是否愿意分享任何其他反馈?" submit-answers="提交"><span slot="successfullySubmitted">您的反馈已成功提交。谢谢!</span></d-s-c-feedback-form></article><nav class="nav-side nav-side--right"><menu-heading-links-scrollable-help menu-title="本文内容" :disabled="false" :headings="pageHeadings"/></nav></div></div><feedback-button-floating tooltip="发送反馈" :disabled="false"/><footer class="container--full-width"><div class="container--centered"><div class="footer__links text--caps"><ul><li><a href="https://www.tableau.com/zh-cn/legal" class="">法律</a></li><li><a id="privacyLink" class="">隐私</a></li><li><a href="#" data-ignore-geolocation="true" class="optanon-toggle-display">Cookie 首选项</a></li></ul></div><div class="footer__copyright text--caps"><copyright-notice year-start="2003" notice-text="Salesforce, Inc."/></div></div></footer></div> </body>
推荐文章