建立 Looker 運算式

Looker 運算式

Looker 運算式 (有時稱為 Lexp) 可用於針對下列項目執行計算:

Looker 運算式是由下列元素組合而成:

  • NULL:NULL 表示沒有資料,可用於檢查某個項目是否為空白或不存在。

  • 常數:常數是指您提供的不變值。數字 (例如 7) 或字串 (例如 Completed) 都是常數。

  • Looker 欄位:Looker 欄位的參照,包括維度、測量指標和資料表計算。

  • Looker 運算子:運算子有幾種,詳列於「Looker 函式和運算子」說明文件頁面:

    • 數學運算子 (例如 +-*/)
    • 比較運算子 (例如 =><=)
    • 邏輯運算子 (例如 ANDORNOT)
  • Looker 函式:這類函式與 Excel 函式類似,您可以使用函式,以複雜的方式轉換資料或參照資料。如要查看所有可用函式,請參閱「Looker 函式和運算子」說明文件頁面。

建立 Looker 運算式

資料表計算自訂欄位自訂篩選器都使用 Looker 運算式編輯器。輸入運算式時,Looker 會提示您可能想使用的函式、運算子和欄位名稱。

查看所有建議

在「探索」中建立資料表計算自訂欄位自訂篩選條件,即可存取 Looker 運算式編輯器。

輸入空格,即可查看所有可供選擇的欄位、函式和運算子清單。如果目前在「探索」中選取某個欄位,Looker 會在該欄位左側顯示黑點,並將該欄位顯示在清單頂端。

在 Looker 運算式編輯器中輸入內容,縮短清單,只顯示您感興趣的項目。

如果自訂欄位與目前使用的 Explore 欄位相容,自訂欄位編輯器就會顯示這些欄位。

新增欄位

如要在運算式中加入 Looker 欄位,請開始輸入欄位名稱。輸入時,編輯器會縮小搜尋範圍,只顯示包含您輸入內容的欄位和函式。您可以輸入欄位在「探索」頁面上的名稱,也可以使用 LookML 名稱 (如果知道的話)。

從清單中選取欄位時,Looker 會使用 ${view_name.field_name} 形式的 LookML 名稱,將欄位新增至運算式。這可確保運算式中的所有欄位都有專屬名稱。

新增總計

如果您要根據顯示總計的「探索」建立運算式,也可以在運算式中加入欄和列的總計。編輯器會顯示欄總計,並在欄位名稱的 LookML 疊代版本前方加上「總計」一詞。舉例來說,如果欄位名稱為「Count」,Looker 會將該欄位的資料欄總計命名為「Count」Count - Total

總計的 LookML 名稱格式為 ${view_name.field_name:total},其中 :total 會加到欄位名稱結尾。

如為列總計,編輯器中的欄位名稱前面會顯示「列總計」字樣;在欄位的 LookML 名稱中,欄位名稱結尾會加上 :row_total,例如 ${view_name.field_name:row_total}

新增運算子

視需要,您可以在運算式中加入 ANDORNOT 等邏輯運算子。通常 AND 運算子會先於 OR 運算子評估,但您可以使用括號覆寫此行為。您也可以使用比較運算子 (例如 >=<=) 和數學運算子 (例如 +*)。

將游標懸停在運算子上時,資訊窗格會顯示正確使用方式的附註。

加入函式

如要在運算式中加入 Looker 函式,請開始輸入函式名稱。輸入時,編輯器會縮小搜尋範圍,只顯示包含您輸入內容的欄位和函式。

函式可能由需要特定類型的引數 (或變數) 構成,例如欄位、數字或「是/否」。將游標懸停在函式上時,您可以查看資訊窗格中運算式旁邊顯示的附註,瞭解需要提供的引數,以及引數的類型。

如需 Looker 提供的完整函式清單,請參閱「Looker 函式和運算子」說明文件頁面。

使用錯誤提示和資訊窗格

Looker 會在 Looker 運算式編輯器旁顯示資訊窗格。這個窗格會提供文件和建議,特別是當運算式發生錯誤時。

運算式編輯器旁的資訊窗格會提供下列資訊:

  • 醒目顯示錯誤:Looker 會以紅色底線標示運算式中尚未正確的部分。

  • 建議和錯誤詳細資料:Looker 會根據運算式提供後續新增內容的建議。如果發生錯誤,系統會說明原因。如果有多個錯誤,系統會根據游標位置顯示錯誤。

  • 說明文件:Looker 會根據游標位置,顯示您使用的函式或運算子相關說明文件。舉例來說,當您輸入 if() 函式的第一個引數時,Looker 會提供資訊,指出第一個引數應評估為 true 或 false。您可以點選函式名稱,前往該函式的說明文件。

包括註解

如要在 Looker 運算式中加入註解,請在運算式編輯器中,於註解行的開頭使用 #

使用欄位

有時您會在運算式中使用欄位值 (維度、指標或資料表計算)。您可能會想將欄位值加到其他項目、檢查欄位值是否為特定值、將欄位值納入函式,或進行許多其他操作。

本頁稍早所述,您可以在運算式編輯器中輸入欄位名稱,Looker 會協助您找出參照欄位的正確方式。在運算式中新增欄位時,Looker 會使用欄位的 LookML 識別碼,看起來像 ${view_name.field_name}。輸入欄位名稱 (如欄位挑選器所示),運算式編輯器就會一併顯示欄位挑選器名稱和 LookML 識別碼。

您可以透過下列幾種方式擷取值:

  • 從同一列取得值:最基本的使用欄位方式是直接參照欄位。舉例來說,運算式可能會使用 ${product.category}。這麼做時,您會表示「針對任何指定資料列,從該資料列擷取產品類別」。

  • 從其他資料列取得值:您也可以從其他資料列取得欄位的值。舉例來說,您可能需要「針對任何指定資料列,從前一個資料列擷取產品類別」的邏輯。如要執行這項操作,可以使用位移函式 (請參閱這份位置函式清單)。位移函式可能如下所示:offset(${product.category}, -1)

  • 從透視資料欄取得值:您也可以從透視資料欄取得值。舉例來說,您可能需要「針對任何指定資料列,從第一個樞紐分析欄擷取總銷售額」的邏輯。如要使用透視欄,您需要使用透視函式 (請參閱這份透視函式清單)。樞紐函式可能如下所示:pivot_index(${order.total_sales}, 1)

  • 取得資料列或資料欄的總計:如果在「探索」中新增總計,只要在欄位名稱中加入 :total (資料欄總計) 或 :row_total (資料列總計),即可取得資料欄或資料列的總計值,格式為 ${field_name:total}。舉例來說,如果您想取得「訂單」總數的百分比,可以建立類似 ${orders.count} / ${orders.count:total} 的表格計算。

使用運算子

Looker 運算式可包含邏輯、比較和數學運算子,用來建立不同條件:

  • 邏輯運算子 (例如 ANDORNOT)
  • 比較運算子 (例如 ><)
  • 數學運算子 (例如 +-)

除非您使用括號另行指定,否則系統會先評估 AND 邏輯,再評估 OR 邏輯。以下運算式沒有額外括號:

if (
  ${order_items.days_to_process}>=4 OR
  ${order_items.shipping_time}>5 AND
  ${order_facts.is_first_purchase},
"review", "okay")

會評估為:

if (
  ${order_items.days_to_process}>=4 OR
  (${order_items.shipping_time}>5 AND ${order_facts.is_first_purchase}),
"review", "okay")

在 Looker 中,請使用 yesno,而非 truefalse。這些邏輯常數並非引號括住的字詞 "yes""no"。詳情請參閱邏輯常數說明

使用函式

Looker 運算式通常包含一或多個函式,可協助您擷取特定資料或計算特定項目。這類函式與 Excel 函式性質相似。

函式的形式為名稱後方加上兩個括號,例如 my_function()。您可能需要在括號中提供資訊,並以半形逗號分隔。這些資訊稱為「引數」,外觀如下:my_function(argument_1, argument_2)

舉例來說,now 函式不接受任何引數,會傳回目前的日期和時間。使用方式如下:now()

round 函式「會」接受一個引數,也就是數字。使用方式如下:round(3.2)。結果為 3

如要瞭解需要提供的引數 (如有),有兩種方法:

  • 運算式編輯器旁邊會顯示資訊窗格,提供您正在編寫的函式相關說明文件。按一下函式名稱即可前往相關文件。
  • 您也可以直接前往 Looker 函式和運算子說明文件頁面,尋找要使用的函式。

contains 函式為例,其說明文件如下所示:

函式 語法 目的
contains contains(string, search_string) 如果 string 包含 search_string,則傳回 Yes,否則傳回 No

您可以看到需要兩個引數。這些名稱為 stringsearch_string,但這不代表您需要在函式中輸入「string」和「search_string」這兩個字。這些只是引數的名稱,您將替換為其他內容。閱讀用途後,我們發現 string 應該是我們要中搜尋的欄位或其他值,而 search_string 則是我們要搜尋的內容。舉例來說:

contains(${customer.feedback_text}, "great")

如果顧客意見回饋中出現「很棒」一詞,這項函式就會傳回 Yes。否則會傳回 No

您可以將函式放在其他函式中,處理複雜的邏輯。只要內部函式的結果適合外部函式的引數,就會正常運作。例如:

contains(
  if(
    is_null(${customer.feedback_text}),
    ${customer.comment_text},
    ${customer.feedback_text}
  ),
"great")

is_null 函式會巢狀內嵌在 if 函式中,而 if 函式本身則內嵌在 contains 函式中。運作方式如下:

  1. is_null() 函式會檢查顧客意見回饋文字。
  2. 接著,if() 函式會使用該結果,並傳回顧客意見回饋文字 (如有),否則會傳回顧客留言文字。
  3. 最後,contains() 函式會使用 if() 函式傳回的文字,並搜尋「great」一詞。

從邏輯上來說,這個運算式的意思是:「如果有顧客意見回饋,請在其中搜尋。如果沒有,請改為搜尋顧客留言。在這兩種情況下,請尋找「great」一詞。