知識庫

計算正在執行或正在移動的不重複計數


發佈時間 : 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 加總。
  • 這些計算必須位於單獨的導出欄位中,以便我們可以設定表函數如何以不同的方式運算。
這篇文章是否解決了問題?