在 Tableau Prep 工作簿“duplicates from union.tfl”中,“January Orders”(一月订单)是一月份订单的第一个报表。“January Orders (corrections)”(一月订单(修正))"表是稍后发布的报表,其中包含一些新订单,但也包含针对“January Orders”(一月订单)中已存在的订单的修正。合并这两个表之后,两个表中的所有行都会保留,从而会产生重复的度量。
“duplicates from union.tfl”中的第一个流程展现出了此问题。
选项 1: 保留一个表中的所有数据和另一个表中的非匹配数据
对于此示例,我们需要“January Orders (corrections)”(一月订单(修正))中的所有数据,并且只需要“January Orders”(一月订单)中在“January Orders (corrections)”(一月订单(修正))中不存在的订单。
- 在“January Orders”(一月订单)和“January Orders (corrections)”(一月订单(修正))之间创建一个新联接
- 在“联接 1”步骤中,执行以下操作:
- 对于“应用的联接子句”,依据“[Order ID] = [Order ID]”创建一个联接子句
- 对于“联接类型”,单击维恩图的各个部分以便只填充最左边的一段。Tableau Prep 会将此称为“仅左侧不匹配”联接。
- 将“January Orders (corrections)”(一月订单(修正))拖到“联接 1”上,并将该表放在“新建并集”上
选项 2: 保留具有最近日期的记录
例如,Mouse 女士更改了其订单来增加另一件外套,但此项更改意外地记录在了“January Orders”(一月订单)中。 正确的订单是具有最近日期的订单。
- 依据“[Order ID] = [Order ID]”在“January Orders”(一月订单)和“January Orders (corrections)”(一月订单(修正))之间创建一个完全外部联接
- 从“联接 2”中添加一个步骤
- 合并除日期字段和度量值之外的所有匹配字段:
- 单击其值应取代“配置”窗格中的另一个值的字段
- 按住 Ctrl 单击匹配的字段
- 右键单击任一字段,并选择“合并字段”
- 合并字段之后,Tableau Prep 不会同时保留两个值(如果有两个不同的值),而是保留先选择的字段(如果有)中的值。
- 例如,Horse 女士的姓名在“January Orders”(一月订单)表中被意外地记录为 House 女士,而其正确的姓名出现在“January Orders (corrections)”(一月订单(修正))中。 在合并“[Customer]”(客户)和“[Customer-1]”(客户-1)时,我想要先选择“[Customer-1]”(客户-1)。
- 您可以通过已合并字段的名称来验证哪个字段将替代另一个字段。名称的格式类似于“[第一个字段名称 & 第二个字段名称]”。先列出的字段名称将是会替代另一个字段的字段。
- 如果字段的合并顺序不正确,可通过在“配置”窗格中右键单击已合并字段名称上方的合并图标并选择“移除”来撤消合并。
- 单击“创建计算字段...”按钮
- 在打开的“计算字段”对话框中,执行以下操作,然后单击“确定”:
- 命名此计算字段。在此示例中,计算字段名为“Most Recent Date”(最近日期)
- 在公式字段中,创建一个类似于如下的计算:
IF [Date] > [Date-1]
THEN [Date]
ELSE IFNULL( [Date-1], [Date] )
END
- 如果“[Date]”(日期)比“[Date-1]”(日期-1)“大”或者就日期而言比较近,则上面的计算将返回“[Date]”(日期)。否则计算将返回“[Date-1]”(日期-1)。
- 如果任一字段为 NULL,则第一个条件将始终为 false。如果“[Date-1]”(日期-1)为 NULL,IFNULL() 函数会将“[Date-1]”(日期-1)替换为“[Date]”(日期)。这意味着计算将始终返回非 NULL 值(如果有)。
- 移除“[Date]”(日期)和“[Date-1]”(日期-1)
- 使用类似于如下的计算创建一个名称类似于“New Cost”(新成本)的计算字段:
IF [Date] > [Date-1]
THEN [Cost]
ELSE IFNULL( [Cost-1], [Cost] )
END
- 移除“[Cost]”(成本)和“[Cost-1]”(成本-1)
- 为每个度量重复步骤 6-7
选项 3:应以不同的方式处理每个重复项
- 依据“[Order ID] = [Order ID]”在“January Orders”(一月订单)和“January Orders (corrections)”(一月订单(修正))之间创建一个完全外部联接
- 从“联接 3”中添加一个步骤
- 合并满足以下任一条件的所有字段:a) 有两个表中具有相同值,或者 b) 一个表中的值应始终替代
- 单击“创建计算字段...”按钮
- 在打开的“计算字段”对话框中,执行以下操作,然后单击“确定”:
- 命名此计算字段。在此示例中,计算字段名为“New Cost”(新成本)
- 在公式字段中,创建一个类似于如下的计算:
CASE [Order ID-1 & Order ID]
WHEN 5 THEN [Date]
WHEN 9 THEN [Date]
ELSE IFNULL([Date-1],[Date])
END
- 上面的计算将浏览“[Order ID-1 & Order ID]”(订单 ID-1 & 订单 ID)的每个值,并返回指定的日期字段。为了简化操作,我只指定了哪些 ID 应返回“[Date]”(日期),而任何其他 ID 将返回“[Date-1]”(日期-1),或者因为有 ELSE 语句的原因,将在“[Date-1]”(日期-1)为 NULL 的情况下返回“[Date]”(日期)。
- 之所以在 CASE 语句中使用“[Order ID-1 & Order ID]”(订单 ID-1 & 订单 ID)值,原因是此字段的每行数据将具有唯一值。
- 这也意味着,将来重新运行此流程时,增加的任何新 ID 将返回“[Date-1]”(日期-1)。
- 移除“[Date]”(日期)和“[Date-1]”(日期-1)
- 为需要单独处理重复项的所有字段重复步骤 4-6