自訂表達式

何時應使用自訂表達式,以及為何應在 Metabase 的筆記本編輯器中加以利用。

在數學中,表達式是符號的集合,這些符號共同表達一個值。如果您以前使用過試算表軟體,表達式就是公式,例如 =SUM(A1, B1)

Metabase 查詢產生器中的自訂表達式是強大的工具,可以涵蓋絕大多數的分析使用案例,而無需從工具箱中取出 SQL。事實上,使用查詢產生器有很多優於使用 SQL 的優勢

  • 擴充性:使用查詢產生器來建立查詢,可讓使用者從您的問題中學習和建構,而無需具備任何 SQL 知識。
  • 鑽取 功能可讓使用者依類別細分記錄、放大、向下鑽取到未彙總的記錄,或點擊資料進行 X 光檢視。使用 Metabase 查詢產生器建立的問題將為使用者提供完整的鑽取功能,但使用 SQL 建立的問題僅會顯示有限的選項,例如依值篩選。

而且您可以隨時在開發過程中切換到 SQL,方法是將現有的問題轉換為原生 SQL 問題

在查詢產生器中有三個地方可以使用自訂表達式

  • 自訂欄使用函數來計算值(例如 + 加數字)或操作文字(例如 lower 將文字變更為小寫)。
  • 自訂過濾器使用函數(例如 contains),這些函數的評估結果為 true 或 false。
  • 自訂摘要使用函數(例如 countsum)來彙總記錄。

自訂欄

我們可以使用表達式將自訂欄新增至資料,以計算新的欄。讓我們看看表達式的實際應用。以下是 Metabase 隨附的範例資料庫中的「Orders」表格。

The Orders table in the Sample Database included with Metabase.

假設我們想要知道根據稅前小計套用至訂單的折扣百分比。例如,如果我們在 10 美元的訂單上給予 1 美元的折扣,我們會希望看到一個欄顯示我們已將該訂單折扣 10%。

遺憾的是,快速掃描預覽中的欄會告訴我們,資料庫未儲存該計算(即沒有「折扣百分比」欄)。我們只有訂單的小計和折扣總計。

然而,感謝數學,我們可以使用折扣總計和訂單小計來計算百分比。這就是表達式發揮作用的地方:我們可以使用表達式來計算每一列的折扣百分比,並將計算出的值儲存在新的欄中。

讓我們逐步了解如何建立自訂欄。

在查詢產生器中,我們選取「資料區段」中的自訂欄

為了計算折扣百分比,我們需要將折扣除以原始總計(「Subtotal」)才能取得折扣百分比。

在表達式中,我們使用方括號來參照欄。例如,我們可以將「Orders」表格中的「Discount」欄參照為 [Discount]。如果我們需要參照由外鍵連結的另一個表格中的欄,我們可以使用表格和欄之間的 .,如 [Table.Column] 中所示(或者,您可以從輸入左方括號 ([) 時出現的下拉式選單中選取 [Table → Column])。例如,我們可以輸入 [Products.Category],它將解析為:[Products → Category]

目前,我們只對「Orders」表格中的欄感興趣,因此無需參照另一個表格。以下是我們將用來計算自訂折扣百分比欄的表達式(或公式)

= [Discount] / [Subtotal]

在「表達式」欄位中輸入該表達式,然後為新欄位命名:「Discount percentage」。

Entering a field formula to create a custom column.

按一下「完成」,然後按一下「視覺化按鈕」以查看您的新欄。

由於我們新的「Discount percentage」欄中的值與折扣有關,因此讓我們將該欄移到「Discount」欄旁邊。您可以透過按一下欄標題並將欄拖曳到目標位置,在表格中移動欄,如下所示

Dragging a column to change its position in the table visualization.

由於我們正在計算百分比,因此讓我們修正格式,使其更易於閱讀。按一下「Discount percentage」標題以顯示該欄的「動作選單」,然後按一下齒輪圖示以格式化該欄。

Metabase 將滑出一個包含選項的格式化側邊欄。讓我們將樣式變更為「百分比」,並將小數位數增加到「2」。而且由於標題「Discount percentage」佔用大量空間,因此讓我們將欄重新命名為「Discount %」。

還有一個選項可以新增迷你長條圖。此長條圖不會顯示相對於 100% 的百分比;相反地,迷你長條圖會向我們顯示相對於給其他訂單的折扣百分比的折扣百分比。我們暫時關閉迷你長條圖。

以下是完成的問題,其中新增了「Discount %」欄

Our finished Discount % column.

自訂過濾器

Metabase 隨附許多開箱即用的過濾選項,但您可以使用自訂過濾器表達式設計更複雜的過濾器。這些對於建立使用 OR 陳述式的過濾器特別有用,這也是我們將在此處涵蓋的內容。

通常在查詢產生器中,當我們將多個過濾器新增至問題時,Metabase 會隱含地使用 AND 運算子組合這些過濾器。例如,如果我們為以 Enormous 開頭的產品新增一個過濾器,並為以 Computer 結尾的產品新增一個過濾器,則我們的問題只會傳回以 Enormous 開頭且以 Computer 結尾的產品,而這在 Metabase 的範例資料庫中不存在。

為了篩選出以 Enormous 開頭或以 Computer 結尾的產品,我們將從「過濾器」下拉式選單中選取「自訂表達式」,並使用 startsWithendsWith 函數

startsWith(string1, string2)
endsWith(string1, string2)

函數 startsWithendsWith 會檢查 string1 是否以 string2 開頭/結尾。因此,string1 是要檢查的字串(大海撈針中的海),而 string2 是要尋找的文字(針)。而且由於我們想要尋找以 Enormous 開頭或以 Computer 結尾的產品,因此我們可以使用 startsWithendsWith 表達式,中間帶有 OR 運算子

= startsWith([Title], "Enormous") OR endsWith([Title], "Computer")

產生的資料集將包含以 Enormous 開頭或以 Computer 結尾的產品

Products that are either enormous or aerodynamic.

請注意,自訂過濾器表達式必須始終解析為 true 或 false。但是,您可以將未解析為 true 或 false 的表達式巢狀在陳述式中,例如

= contains(concat([First Name], [Last Name]), "Wizard")

因為最外層的函數 (contains) 會解析為 true 或 false。然而,您不能使用 concat([First Name], [Last Name]) 作為過濾器,因為它會解析為文字字串(但您可以使用 concat 建立自訂欄,例如「Full Name」)。

自訂摘要

自訂表達式解鎖了許多不同的資料彙總方式。讓我們考慮 Share 函數,它會以小數形式傳回資料中符合條件的列百分比。例如,假設我們想要知道我們的產品線中紙製品的總百分比,即我們的產品線中有多少比例是由紙製品組成的?

首先,我們將從範例資料庫中選取「Products」表格。接下來,我們將按一下查詢產生器中的「摘要按鈕」,然後選取「自訂表達式」。然後,我們將從下拉式選單中選取「Share」,這將提示我們輸入條件。在本例中,我們想要知道哪些產品的標題中包含「Paper」,因此我們將使用 contains 函數來搜尋「Title」。

= Share(contains([Title], "Paper"))

Calculating the share of paper products.

然後我們命名我們的表達式(例如,「Percentage of paper products」),然後按一下「完成」。按一下「視覺化按鈕」,Metabase 將計算紙製品的比例。

若要變更格式,請選取左下角的「設定按鈕」以顯示「設定側邊欄」,然後將「數字選項 → 樣式」變更為「百分比」。

The share of paper products, formatted as a percentage.

整合在一起

讓我們使用表達式建立一個相當複雜(人為)的問題。假設我們的任務是找出 2019 年每月羊毛和棉製品的平均淨流入量,其中淨流入量是售價減去我們為產品支付的成本。換句話說:對於售出的每單位羊毛和棉製品,我們在 2019 年每月平均賺(或虧)多少錢?

為了獲得這些迷人的數字,我們需要使用表達式來

  • 計算每單位售價(自訂欄)。
  • 過濾結果以僅包含羊毛或棉製品(自訂過濾器),並將這些結果限制為 2019 年。
  • 計算平均淨流入量(自訂摘要),並依月份分組。

開始吧

  1. 我們建立一個名為「Unit price」的自訂欄。為了計算「Unit price」,我們將使用表達式將小計除以售出的單位數量(「Quantity」)

    = [Subtotal] / [Quantity]
    
  2. 接下來,我們將使用自訂過濾器表達式來篩選「Wool」和「Cotton」產品的訂單(即,產品的 Product.Title 中的某處包含「Wool」或「Cotton」)。

    = contains([Products → Title], "Wool") OR contains([Products → Title], "Cotton")
    
  3. 我們也將篩選 01/01/201912/31/2019 之間的訂單。

  4. 我們將使用自訂表達式來建立自訂摘要。假設標準零售加價為 50%(基石加價)。因此,如果 Product.Price 為 2 美元,我們將假設產品每單位的取得成本為 1 美元。根據此假設,我們可以簡單地將每單位售出的淨流入量定義為「Unit price」減去 Product.Price 的一半。然後,我們將透過取每個訂單的這些數字的平均值來摘要資料。

    = Average([Unit price] - [Products → Price] / 2)
    
  5. 最後,我們將依月份依 Orders.Created_At 分組這些訂單。

以下是我們的筆記本

Our wool and cotton notebook.

我們將選擇將資料視覺化為折線圖,我們可以按一下該圖表來鑽取資料

Drilling through fabrics to view individual orders.

進一步閱讀

下一步:Metabase 中的聯結

如何在 Metabase 中使用筆記本編輯器在簡單和自訂問題中聯結表格。

下一篇文章