知识库

计算运行或移动不重复计数


发布时间: 07 Nov 2015
上次修改日期: 20 Jul 2023

问题

如何计算维度的运行或移动不重复计数。

例如,在整个时间段内下过订单的独特客户的运行总计,以及在一段时间(例如前三周)内下过订单的独特客户的移动总计。

环境

Tableau Desktop

答案

附带的示例工作簿使用示例数据集“Superstore”来演示以下指引。
单击以展开步骤
选项 1: 使用 FIXED 来查找运行不重复计数
注意:此方法无法查找移动不重复计数。
  1. 选择“分析”>“创建计算字段”
  2. 在打开的“计算字段”对话框中,执行以下操作,然后单击“确定”
    1. 命名此计算字段。在此示例中,计算字段名为“Customer's First Order”(客户的第一个订单)
    2. 在公式字段中,创建一个类似于如下的计算:
      { FIXED [Customer Name], [Order Date] : MIN(
      IF [Order Date] = { EXCLUDE [Order Date] : MIN([Order Date])}
      THEN 1
      ELSE 0
      END
      ) }
      
  3. 使用类似于如下的计算创建一个名称类似于“Accurate Running COUNTD of Customers”(客户的准确运行 COUNTD)的计算字段:
    RUNNING_SUM(SUM([Count Customer's 1st Order]))
  4. 右键单击并将“[Order Date]”(订单日期)拖到视图中
  5. 在“放置字段”对话框中,选择带有绿色日历图标的“WEEK(Order Date)”
  6. 将“[Accurate Running COUNTD of Customers]”(客户的准确运行 COUNTD)拖到“行”功能区
单击以展开步骤
选项 2:使用表函数来查找移动不重复计数
注意: 此解决方案将可能导致性能问题,因为最终视图必须包含运算表计算所需的所有维度。
步骤 1 - 创建 3 个计算字段
  1. 选择“分析”>“创建计算字段”
    1. 在打开的“计算字段”对话框中,执行以下操作,然后单击“确定”:
    2. 命名此计算字段。在此示例中,计算字段名为“Every 3 Week Period a Customer is In”(客户所在的每 3 周期间)
    3. 在公式字段中,创建一个类似于如下的计算:
      	WINDOW_MAX( MAX(1), -2, 0 )
    • Tableau 计算很大程度上依赖于视图。因此,如果没有视图的上下文,此计算将首先为视图中的每个标记(例如,行、点、条形等...)返回值 1,然后将这些 1 的最大值从两个标记返回到此标记。
    • 在此示例中,最终视图为每个客户的每周包含一个标记。因此,在有了该上下文的情况下,如果客户本周或两周前有订单,此计算将返回 1。如果客户每周都有订单,此计算仍然将只返回 1,因为我们使用的是 WINDOW_MAX(),而不是 WINDOW_SUM()。
    • 单单此计算只会为每个客户返回 1 或 0。因此,我们需要将此计算嵌套在 WINDOW_SUM() 中,以将所有客户的 1 加总。这些计算必须位于单独的计算字段中,以便我们可以设置表函数如何以不同的方式运算。
  2. 使用类似于如下的计算创建一个名称类似于“Moving Count of Customers for Every 3 Weeks”(每 3 周客户的移动计数)的计算字段:
    WINDOW_SUM([Every 3 Week Period a Customer is In])
  3. 使用类似于如下的计算创建一个名称类似于“First Filter”(第一个筛选器)的计算字段:
    FIRST() = 0
步骤 2 - 生成视图
  1. 右键单击并将“[Order Date]”(订单日期)拖到“列”功能区。
  2. 在“放置字段”对话框中,选择带有绿色日历图标的“WEEK(Order Date)”
    1. 在“列”功能区上右键单击“WEEK(Order Date)”,并选择“离散”
    2. 日期字段需要为离散字段,否则“[Customer Name]”(客户名称)将会破坏折线图
  3. 将“[Customer Name]”(客户名称)拖到“标记”卡上的“详细信息”
    • “[Customer Name]”(客户名称)字段必须在视图中,以便表计算运算正确。稍后,我们将筛选视图,以便看起来像只有一条线
  4. 将“[Moving Count of Customers for Every 3 Weeks]”(每 3 周客户的移动计数)拖到“行”功能区
步骤 3 - 编辑表计算
  1. 在“行”功能区上右键单击“[Moving Count of Customers for Every 3 Weeks]”(每 3 周客户的移动计数),并选择“编辑表计算…”
  2. 在“表计算”对话框中,执行以下操作并关闭对话框:
    1. “嵌套计算”下,选择“Every 3 Week Period a Customer is In”(客户所在的每 3 周期间)
    2. “计算依据”下,选择“特定维度”
    3. 在维度列表中,仅选中“Week of Order Date”(订单日期所在周)
    4. “嵌套计算”下,选择“Moving Count of Customers for Every 3 Weeks”(每 3 周客户的移动计数)
    5. “计算依据”下,选择“特定维度”
    6. 在维度列表中,仅选中“Customer Name”(客户名称)
      • 对于“[Every 3 Week Period a Customer is In]”(客户所在的每 3 周期间),我们希望 Tableau Desktop 按客户对客户所在的每 3 周期间进行计数。换句话说,我们希望 Table Desktop 计算每个客户内的周数。如果选中一个维度,则意味着将为该维度的每个值运行表计算。如果取消选中一个维度,则意味着 Tableau Desktop 将为该维度的每个值启动计算。
      • 同样,我们希望“[Moving Count of Customers for Every 3 Weeks]”(每 3 周客户的移动计数)对每周内的所有客户进行加总。
  3. 将“[First Filter]”(第一个筛选器)拖到“筛选器”功能区,并单击“确定”关闭“筛选器”对话框
  4. 在“筛选器”功能区上右键单击“[First Filter]”(第一个筛选器),并选择“计算依据”>“Customer Name”(客户名称)。
  5. 在“筛选器”对话框中,选中“True”并单击“确定”

其他信息

有关选项 1 的注意事项:
  • 此计算在每个客户第一次出现在数据集中时对其计数一次。这意味着此方法将不适用于查找移动不重复计数,因为 FIXED 表达式无法查找移动时间段的第一个订单日期。
  • 步骤 2 中的计算执行以下操作:
    • 首先,表达式 { EXCLUDE [Order Date] : MIN([Order Date])} 查找各客户的第一个订单日期。通常,我们将使用表达式 { FIXED [Customer Name] : MIN([Order Date])} 来查找第一个订单。但是,EXCLUDE 的作用域是由外部 FIXED 语句设置的。换句话说,EXCLUDE 语句以维度“[Customer Name]”(客户名称)和“[Order Date]”(订单日期)开始,然后排除“[Order Date]”(订单日期)。
    • 然后,如果日期是该客户的第一个订单日期,则 IF 语句返回 1。
    • 在日期与第一个订单日期匹配的任何行上,IF 语句都将返回 1。这意味着,如果基础数据对于该第一个订单有若干记录,其中每一行都将为 1。由于我们只想对每个客户计数一次,因此 IF 语句的最小值固定到“[Customer Name]”(客户名称)。
    • 我们还需要向 FIXED 语句的维度声明中添加“[Order Date]”(订单日期),以便最终视图将显示一段时间内的更改。
有关选项 2 的注意事项:
  • Tableau 计算很大程度上依赖于视图。因此,如果没有视图的上下文,步骤 2 中的计算将首先为视图中的每个标记(例如,行、点、条形等...)返回值 1,然后将这些 1 的最大值从两个标记返回到此标记。
  • 在此示例中,最终视图为每个客户的每周包含一个标记。因此,在有了该上下文的情况下,如果客户本周或两周前有订单,此计算将返回 1。如果客户每周都有订单,此计算仍然将只返回 1,因为我们使用的是 WINDOW_MAX(),而不是 WINDOW_SUM()。
  • 单单此计算只会为每个客户返回 1 或 0。因此,我们需要将此计算嵌套在 WINDOW_SUM() 中,以将所有客户的 1 加总。
  • 这些计算必须位于单独的计算字段中,以便我们可以设置表函数如何以不同的方式运算。
此文章是否已解决问题?