首頁

>

產品系列

>

Tableau

> 最新 2020.2 Data Model 新功能

最新 2020.2 Data Model 新功能

目前用戶已經可以使用的有 2020.1 所推出的為儀表板呈現效果帶來革命性轉變的動畫功能,以及用戶千呼萬喚的動態參數,每一次的更新同樣帶給用戶豐富的新功能。而 Tableau 終於在五月釋出了最新的 2020.2 版本,其中一項顛覆性的更新便是 Data Model (數據模型),也是今天這篇文章要討論的重點,有興趣的話就繼續看下去吧!

過去的 Data Model

在 2020.1 (含)過去的版本中,你必須準確的指定每個 table,以及他們彼此 join 的所有條件,如下圖中便是一個基本的訂單資料與區經理資料,依據 [區域] 欄位 join 的範例畫面,你會看到兩個資料中間還會出現交集的圖示,必須在這個步驟清楚定義資料間要用 left join, right join, inner join or outer join:

而為了畫出後續的視圖(view),Tableau 會透過以下 SQL 呼叫後端的資料庫:
SELECT *
FROM [1_訂單]
INNER JOIN [2_大區經理]
ON [1_訂單].[區域] = [2_大區經理].[區域]

所有產生的視圖(view)都會以這串 SQL 指令呼叫數據源,即使是沒有使用到第二個表的欄位的視圖。沒錯,就算你創造的 view 中完全沒有使用到 ”2_大區經理” 這個資料表的內容,在撈取資料的時,仍然會先將兩個資料做 join 後,再取出 view 中有使用的內容。舉例來說,當我想要畫一個很基本的各項產品分類的銷售額長條圖,Tableau 會執行以下 SQL:(view),Tableau 會透過以下 SQL 呼叫後端的資料庫:
SELECT [產品分類], SUM([銷售額])
FROM [1_訂單]
INNER JOIN [2_大區經理]
ON [1_訂單].[區域] = [2_大區經理].[區域]
GROUP BY [產品分類]

可想而知,這樣的方式很可能造成不必要的運算資源負荷。

此外有很多時候,join 可能會造成”重複資料”,也就是join後資料筆數錯誤生長,這樣的情況很常發生在一對多或多對一的兩個資料表 join,舉例來說,如果每個區域的區經理都有兩位(表一),那麼和”1_訂單”(表二)對 [區域] 欄位 join 時,變會造成每筆資料重複產生(表三),而導致製作 view 時,數據膨脹的結果。

那麼難道過去的 Tableau 版本沒辦法解決這樣的問題嗎?當然可以,在過去的 data model 中,我們可以透過混合資料(data blending)或是 LOD (Level of Details)計算法解決這樣的問題,但麻煩的是,混合資料會造成很多計算與邏輯上的限制,也不是那麼輕鬆上手,而 LOD 有是相當進階的計算法,對 Tableau 新手村的人們可以說是相當的不友善,甚至有些人可能還沒發現自己已經造成數據膨脹等等。介紹了這麼多舊的 data model,當然就是要告訴各位,這些問題在全新的 data model 中都可以被解決!

在2020.1(含)過去的版本中,你必須準確的指定每個 table,以及他們彼此 join 的所有條件,如下圖中便是一個基本的訂單資料與區經理資料,依據 [區域] 欄位 join 的範例畫面,你會看到兩個資料中間還會出現交集的圖示,必須在這個步驟清楚定義資料間要用 left join, right join, inner join or outer join:

 

而為了畫出後續的視圖(view),Tableau 會透過以下 SQL 呼叫後端的資料庫:
SELECT *
FROM [1_訂單]
INNER JOIN [2_大區經理]
ON [1_訂單].[區域] = [2_大區經理].[區域]

 

所有產生的視圖(view)都會以這串 SQL 指令呼叫數據源,即使是沒有使用到第二個表的欄位的視圖。沒錯,就算你創造的 view 中完全沒有使用到 ”2_大區經理”  這個資料表的內容,在撈取資料的時,仍然會先將兩個資料做 join 後,再取出 view 中有使用的內容。舉例來說,當我想要畫一個很基本的各項產品分類的銷售額長條圖,Tableau 會執行以下SQL:(view),Tableau 會透過以下 SQL 呼叫後端的資料庫:
SELECT [產品分類], SUM([銷售額])
FROM [1_訂單]
INNER JOIN [2_大區經理]
ON [1_訂單].[區域] = [2_大區經理].[區域]
GROUP BY [產品分類]

 

可想而知,這樣的方式很可能造成不必要的運算資源負荷。

 

此外有很多時候,join 可能會造成”重複資料”,也就是 join 後資料筆數錯誤生長,這樣的情況很常發生在一對多或多對一的兩個資料表 join,舉例來說,如果每個區域的區經理都有兩位(表一),那麼和 ”1_訂單”(表二)對 [區域] 欄位join時,變會造成每筆資料重複產生(表三),而導致製作 view 時,數據膨脹的結果。
 

 

那麼難道過去的 Tableau 版本沒辦法解決這樣的問題嗎?當然可以,在過去的 data model 中,我們可以透過混合資料(data blending)或是 LOD (Level of Details)計算法解決這樣的問題,但麻煩的是,混合資料會造成很多計算與邏輯上的限制,也不是那麼輕鬆上手,而 LOD 有是相當進階的計算法,對 Tableau 新手村的人們可以說是相當的不友善,甚至有些人可能還沒發現自己已經造成數據膨脹等等。介紹了這麼多舊的 data model,當然就是要告訴各位,這些問題在全新的 data model中 都可以被解決!

新的 Data Model

在 2020.2 版本中的數據模型,又稱為 data relationship,強調的是資料間的靈活關係,Tableau 會為每個 view 產生專屬的 SQL query,也就是不會再每次都產生整個 table,再從中找出有使用的欄位,而是先去找出使用欄位,再產生最有效率的 SQL 查詢指令撈取資料。

從下圖中可以看到,新的 data model,在兩個資料源中間,並沒有交集的圖案,而只是透過一條線(Tableau 官方叫它noodle😂)連接兩個 table,表示在這個地方,你並不需要指定這兩個資料要用什麼樣的方式 join 在一起。此外當你分別點擊兩個資料源,你會發現下班的資料預覽會將兩者分開呈現,而不像舊的版本中,會直接將 join 的結果顯示在下方,同樣代表在這個階段兩個 table 仍然是彼此獨立的,我們並沒有指定兩者要用什麼方式結合,因此 Tableau 也不會預設一個基本 SQL query 去抓取資料表,而是在製作每張 view 的時候都可以靈活的變化資料間的關係。

那麼我們再來畫一次簡單的各區域銷售額長條圖,會使用什麼樣的 SQL 指令呼叫資料呢?
SELECT [產品分類], SUM([銷售額])
FROM [1_訂單]
GROUP BY [產品分類]

Tableau 發現,在這張圖中並沒有使用到”2_大區經理”當中的欄位內容,所以他只撈取了訂單資料,而非先 join 兩個 table 再取欄位,這能夠減輕我們的查詢負荷。但若是我們想要畫出各產品分類的銷售額長條圖,並且只顯示經理 Tim 的銷售數據呢,那麼 SQL 則會改變如下:
SELECT [產品分類], SUM([銷售額])
FROM [1_訂單]
INNER JOIN [2_大區經理]
ON [1_訂單].[區域] = [2_大區經理].[區域]
WHERE [經理] = 'Tim'
GROUP BY [產品分類]

因為在這裡我們需要兩個 table 的欄位,Tableau 會根據我們在 data model 給予的資料關係建立表之間的 join。這樣 view-based SQL query 讓我們只查詢我們實際上需要的資料,能提升整體的效能。

那麼數據膨脹的問題又要怎麼解決呢?新的 data model 將兩個 table 的資料獨立儲存,在沒有預先 join 的情況下,並不會讓資料筆數產生重複的情況,實際上又是怎麼一回事呢,讓我們繼續往下看。

當我們的區域經理 table 變得像上述的(表一)一樣,出現一對多的情況時,我們同樣要繪製一張各產品分類的銷售額長條圖,Tableau 會產生以下的 SQL query:
SELECT [產品分類], SUM([銷售額])
FROM [1_訂單]
GROUP BY [產品分類]

看起來很眼熟嗎?沒錯!就像前面所說的,Tableau 會編寫專屬於這個 view 的 SQL query,簡單來講就像客製化一樣,而在這個 view 中同樣沒有使用區經理 table 中的欄位,因此不會做 join,自然就不會有數據膨脹發生。

等等,那要是我兩個資料表都要用到呢?讓我們再嘗試畫另一張圖,畫出各產品分類的銷售額長條圖,並且只顯示經理 Tim 的銷售數據,看看 Tableau 這次又會如何查詢資料:
SELECT [產品分類], SUM([銷售額])
FROM [1_訂單]
INNER JOIN (
        SELECT [1_訂單].[區域]
        FROM [1_訂單]
        INNER JOIN [2_大區經理_Multiple]
        ON [1_訂單].[區域] = [2_大區經理_Multiple].[區域]
        WHERE [經理] = 'Tim'
        GROUP BY [1_訂單].[區域]
) AS [Table 1]
ON [1_訂單].[區域] = [Table 1].[區域]
GROUP BY [產品分類]

好了有點複雜了,但仔細看一下其實不難。Tableau 在這次的 view 中發現有一對多的情況產生,因此他並沒有直接 join 兩個表,而是先產生了一個 sub-query:
SELECT [1_訂單].[區域]
FROM [1_訂單]
INNER JOIN [2_大區經理_Multiple]
ON [1_訂單].[區域] = [2_大區經理_Multiple].[區域]
WHERE [經理] = 'Tim'
GROUP BY [1_訂單].[區域]

這個子查詢會將原本因為有兩位經理而重複的區域欄位,篩選到只剩下我們需要的 Tim 經理紀錄,因此接著再做 join 時,便可以避免資料重複的情況發生,是不是很聰明方便呢!如此一來我們也不需要透過撰寫複雜的 LOD 來計算正確的銷售額,真的是太好了呀。(但別開心得太早,這只是 LOD 的應用情境之一,在某些情況下我們仍然需要使用 LOD 來達成計算目的,所以還是乖乖學起來吧。)

看完這次的分享,大家是不是對新的 data model 有更多的了解了呢,大家趕快下載最新版本的 Tableau 來體驗一下這個顛覆性更新 data model 的魅力吧!

此篇文章參考來源

在 2020.2 版本中的數據模型,又稱為 data relationship,強調的是資料間的靈活關係,Tableau 會為每個 view 產生專屬的 SQL query,也就是不會再每次都產生整個 table,再從中找出有使用的欄位,而是先去找出使用欄位,再產生最有效率的 SQL 查詢指令撈取資料。

 

從下圖中可以看到,新的 data model,在兩個資料源中間,並沒有交集的圖案,而只是透過一條線(Tableau 官方叫它noodle😂)連接兩個 table,表示在這個地方,你並不需要指定這兩個資料要用什麼樣的方式 join 在一起。此外當你分別點擊兩個資料源,你會發現下班的資料預覽會將兩者分開呈現,而不像舊的版本中,會直接將 join 的結果顯示在下方,同樣代表在這個階段兩個 table 仍然是彼此獨立的,我們並沒有指定兩者要用什麼方式結合,因此 Tableau 也不會預設一個基本 SQL query 去抓取資料表,而是在製作每張 view 的時候都可以靈活的變化資料間的關係。

 

那麼我們再來畫一次簡單的各區域銷售額長條圖,會使用什麼樣的 SQL 指令呼叫資料呢?
SELECT [產品分類], SUM([銷售額])
FROM [1_訂單]
GROUP BY [產品分類]

 

Tableau 發現,在這張圖中並沒有使用到”2_大區經理”當中的欄位內容,所以他只撈取了訂單資料,而非先 join 兩個 table 再取欄位,這能夠減輕我們的查詢負荷。但若是我們想要畫出各產品分類的銷售額長條圖,並且只顯示經理 Tim 的銷售數據呢,那麼 SQL 則會改變如下:
SELECT [產品分類], SUM([銷售額])
FROM [1_訂單]
INNER JOIN [2_大區經理]
ON [1_訂單].[區域] = [2_大區經理].[區域]
WHERE [經理] = 'Tim'
GROUP BY [產品分類]

 

因為在這裡我們需要兩個 table 的欄位,Tableau 會根據我們在 data model 給予的資料關係建立表之間的 join。這樣 view-based SQL query 讓我們只查詢我們實際上需要的資料,能提升整體的效能。

 

那麼數據膨脹的問題又要怎麼解決呢?新的 data model 將兩個 table 的資料獨立儲存,在沒有預先 join 的情況下,並不會讓資料筆數產生重複的情況,實際上又是怎麼一回事呢,讓我們繼續往下看。

 

當我們的區域經理 table 變得像上述的(表一)一樣,出現一對多的情況時,我們同樣要繪製一張各產品分類的銷售額長條圖,Tableau 會產生以下的 SQL query:
SELECT [產品分類], SUM([銷售額]
FROM [1_訂單]
GROUP BY [產品分類]

 

看起來很眼熟嗎?沒錯!就像前面所說的,Tableau 會編寫專屬於這個 view 的 SQL query,簡單來講就像客製化一樣,而在這個 view 中同樣沒有使用區經理 table 中的欄位,因此不會做 join,自然就不會有數據膨脹發生。

 

等等,那要是我兩個資料表都要用到呢?讓我們再嘗試畫另一張圖,畫出各產品分類的銷售額長條圖,並且只顯示經理 Tim 的銷售數據,看看 Tableau 這次又會如何查詢資料:
SELECT [產品分類], SUM([銷售額])
FROM [1_訂單]
INNER JOIN (
        SELECT [1_訂單].[區域]
        FROM [1_訂單]
        INNER JOIN [2_大區經理_Multiple]
        ON [1_訂單].[區域] = [2_大區經理_Multiple].[區域]
        WHERE [經理] = 'Tim'
        GROUP BY [1_訂單].[區域]
) AS [Table 1]
ON [1_訂單].[區域] = [Table 1].[區域]
GROUP BY [產品分類]

 

好了有點複雜了,但仔細看一下其實不難。Tableau 在這次的 view 中發現有一對多的情況產生,因此他並沒有直接 join 兩個表,而是先產生了一個 sub-query:
SELECT [1_訂單].[區域]
FROM [1_訂單]
INNER JOIN [2_大區經理_Multiple]
ON [1_訂單].[區域] = [2_大區經理_Multiple].[區域]
WHERE [經理] = 'Tim'
GROUP BY [1_訂單].[區域]

 

這個子查詢會將原本因為有兩位經理而重複的區域欄位,篩選到只剩下我們需要的 Tim 經理紀錄,因此接著再做 join 時,便可以避免資料重複的情況發生,是不是很聰明方便呢!如此一來我們也不需要透過撰寫複雜的 LOD 來計算正確的銷售額,真的是太好了呀。(但別開心得太早,這只是 LOD 的應用情境之一,在某些情況下我們仍然需要使用 LOD 來達成計算目的,所以還是乖乖學起來吧。)

 

看完這次的分享,大家是不是對新的 data model 有更多的了解了呢,大家趕快下載最新版本的 Tableau 來體驗一下這個顛覆性更新 data model 的魅力吧!

 

此篇文章參考來源