常見的 LookML 模式

本頁面將說明 LookML 中的下列常見模式:

標示欄位 (以及 UI 中的名稱)

Looker 會將 LookML 欄位名稱轉換成 UI 顯示的字串,方法是將以一般粗細字體顯示的檢視畫面名稱,與以粗體顯示的欄位簡稱合併。舉例來說,Orders 檢視畫面中的「Amount」欄位會在 UI 中顯示為「Orders」欄位。為了讓討論內容更清楚,本頁會將兩個欄位名稱加粗,並將檢視名稱改為大寫 (ORDERS Amount)。

如果您希望欄位的名稱與資料表中的欄名稱不同,請變更欄位名稱,並使用 sql 參數將欄位連結至資料表中的適當欄。在以下範例中,airports 資料表包含 cntrl_twr 欄。Looker 會產生以下宣告:

view: airports {
  dimension: cntrl_twr {        # full name: airports.cntrl_twr
    type: yesno                 # default name: AIRPORT Cntrl Twr (Yes/No)
    sql: ${TABLE}.cntrl_twr ;;  # the sql expression for this field
  }
}

您可以將 cntrl_twr 維度重新命名為人類可讀的名稱:

view: airports {
  dimension: has_control_tower {  # full name: airports.has_control_tower
    type: yesno                   # aliased name: AIRPORTS Has Control Tower (Yes/No)
    sql: ${TABLE}.cntrl_twr ;;    # the sql expression for this field
  }
}

依據維度篩選計數

您可以依維度和實體計數進行分組,例如依「使用者國家/地區」和「訂單計數」分組,即可瞭解訂單來自哪些國家/地區。不過,建立以某些維度值篩選的計數值通常很有用。舉例來說,您可以建立新的評估指標並命名為「ORDERS France Count」

view: users {
  dimension: country {}
}
view: orders {
  dimension: id {
    primary_key: yes
    sql: ${TABLE}.id ;;
  }
  measure: count {
    type: count
    drill_fields: [detail]
  }
  measure: france_count {
    type: count   # COUNT(CASE WHEN users.country = 'France' THEN 1 ELSE NULL END)
    filters: [users.country: "France"]
  }
}

篩選器可以使用任何運算式。如果您想要建立一個用來計算歐盟使用者的欄位,可以使用以下範例:

measure: eu_count {
  type: count   # COUNT(CASE WHEN users.countrycode IN 'UK','FR','ES' THEN 1 ELSE NULL END)
  drill_fields: [detail]
  filters: [users.countrycode: "UK,FR,ES"]
}

如要使用數學運算式進行篩選,請務必在運算式前後加上雙引號:

measure: total_orders_above_100_dollars {
  type: sum   # SUM(CASE WHEN order.value > 100 THEN order.value ELSE NULL END)
  sql: ${order.value} ;;
  drill_fields: [detail]
  filters: [order.value: ">100"]
}

百分比

許多關鍵績效指標都是以百分比表示,例如「退貨百分比」、「促成銷售的電子郵件百分比」,或其他「X 與 Y 的百分比」等。在 LookML 中,設計模式是為這兩個條件建立計數,並建立第三個欄位,計算這兩者之間的百分比。

dimension: returned {
  type: yesno
}
measure: count {   # total count of items
  type: count_distinct
  sql: ${TABLE}.id ;;
  drill_fields: [detail]
}
measure: returned_count {   # count of returned items
  type: count_distinct
  sql: ${TABLE}.id ;;
  drill_fields: [detail]
  filters: [returned: "Yes"]
}
measure: percent_returned {
  type: number
  sql: 100.0 * ${returned_count} / NULLIF(${count}, 0) ;;
  value_format: "0.00"
}

請使用下列格式計算百分比。在 Postgres 中,計數為整數,整數之間的除法結果為整數。乘以 100.0 會將第一個計數轉換為浮點數,進而將運算式的其餘部分轉換為浮點數。為避免除以零錯誤,NULLIF(value, 0) 會將零值轉換為空值,讓結果為空值並避免發生錯誤。

100.0 * ${returned_count} / NULLIF(${count}, 0)

使用集合來查看詳細資料

Looker 最強大的功能之一,就是能夠深入探討資料,查看構成計數或其他評量指標的基礎實體。

當您在 UI 中按一下評估指標時,Looker 會建立新查詢,以便將組成評估指標的資料集本地化。表格中每列每個維度的每個值都會加進

如要顯示詳細資料,Looker 需要指定的鑽研欄位清單,以便在點選評量值時顯示。產生模型時,產生器通常會為您建立一些初始鑽研欄位。此外,您也可以自行新增鑽研欄位。舉例來說,假設您要根據過去一週的使用者狀態評估訂單數量。在 Looker 中,查詢會如下所示:

USERS 狀態訂單數量
加州24
德州5
科羅拉多州4
佛羅里達州4
伊利諾州4

如果您在「加州」資料列中按一下「24」,系統可能會顯示來自加州的 24 筆訂單。雖然 Looker 會新增「使用者所在州:加州」篩選器,但它不知道您想在訂單中顯示哪些欄位。您必須先使用集合,在模型中宣告這些欄位。

在 LookML 中,「集合」是指欄位 (維度、評估項目和篩選器) 名稱的清單。您可以使用集合向 Looker 提供下列資訊:

  • 在深入查看計數或其他評量時要顯示的欄位
  • 彙整檢視畫面時要匯入的欄位
  • 您希望在探索中建立索引的欄位

同一個集合可用於模型的多個位置,因此 Looker 提供多種建立集合的方法。

文字集

在 LookML 中定義集合的簡單方法是使用字面值集,尤其是當集合只使用一次時。您可以將集合宣告為陣列,藉此建立文字集。您可以使用 [] 宣告文字常值集。

請見如下範例:

view: customers {
  dimension: id {
    primary_key: yes
  }
  measure: count {
    type: count
  }
  dimension: city {}
  dimension: state {}
  dimension: name {}
}

在本範例中,您要顯示的欄位是 idnamecity

在評估指標中,您可以宣告常值陣列,如下所示:

measure: count {
  type: count
  drill_fields: [id, name, city]
}

命名集合

假設 customers 檢視畫面中定義了兩個計數:countin_california_count。當使用者在探索中深入查看「Count」欄位或「In California Count」欄位時,您想顯示 idnamecity 欄位。

一開始,宣告這些欄位的值似乎就足夠了:

view: customers {
  measure: count {
    type: count
    drill_fields: [id, name, city]
  }
  measure: in_california_count {
    type: count
    filters: [state: "California"]
    drill_fields: [id, name, city]
  }
}

不過,如果您想新增欄位 (例如 customers.state),就必須編輯這兩份清單,除非您使用 set 參數建立命名集,這樣就能在一個位置維護資料,並在多個位置使用。

以下程式碼會建立一組 customers.detail,並將兩個計數指向相同的欄位組合。

view: customers {
  set: detail {
    fields: [id, name, city]      # creates named set customers.detail
  }

  measure: count {
    type: count
    drill_fields: [detail*]       # show fields in the set "customers.detail"
  }
  measure: in_california_count {
    type: count
    filters: [state: "California"]
    drill_fields: [detail*]      # show fields in the set "customers.detail"
  }
}

LookML 集合具有下列強大功能:

  • 重新宣告集合時,會以累加方式進行。如果您在多個位置宣告集合,Looker 就會在所有位置納入為該集合宣告的所有欄位。
  • 如要將集合嵌入其他集合中,請輸入其他集合名稱後加上星號,例如 setname*
  • 如要從集合中移除元素,請在欄位名稱前面加上連字號,例如 -fieldname

自訂細查視覺化效果

如果 Looker 管理員已啟用視覺鑽研 Labs 功能,Look 和 Explore 的鑽研圖表視覺化效果不會一律預設為資料表。在這種情況下,您可以使用 link 參數中的 Liquid 變數自訂要顯示的圖表,如 link 參數說明文件和更強大的資料鑽研最佳做法頁面所示。

資訊主頁支援使用 link 參數的視覺鑽研功能,無須啟用視覺鑽研 Labs 功能。

篩選結果集

LookML 提供一組篩選運算,可套用至欄位和探索,在將結果集傳回使用者前進行篩選。

在「探索」中按下 always_filter

使用 always_filter 一律將一組篩選器套用至在探索中執行的任何查詢。篩選器會顯示在 Looker UI 中,雖然使用者可以變更您提供的預設篩選器值,但無法移除篩選器。一般來說,這些篩選器可用來移除您平常不想納入的資料。舉例來說,假設你只想在「訂單」探索中查看已完成或待處理的訂單。您可以加入下列 LookML 程式碼:

explore: orders {
  view_name: order
    filters: [status: "complete,pending"]
  }
}

如果使用者想查看其他狀態值的訂單,可以在 UI 中將「訂單狀態」設為 %

在「探索」中按下 sql_always_where

如果您想套用使用者無法變更的查詢限制,可以使用 sql_always_where。除了由人類使用者執行的查詢,這項限制也適用於資訊主頁、排程設定的 Look 圖表,以及依賴該 Explore 的內嵌資訊。除非使用者查看所建立查詢的基礎 SQL,否則系統不會向使用者顯示 sql_always_where 條件。

以下範例會禁止使用者查看 2012-01-01 之前的訂單:

# Using Looker references
explore: order {
  sql_always_where: ${created_date} >= '2012-01-01' ;;
}

# Using raw SQL
explore: order {
  sql_always_where: DATE(created_time) >= '2012-01-01' ;;
}

在「探索」中按下 conditionally_filter

查詢非常大型的資料表時,請三思而後行,因為無限的查詢很快就會對資料庫造成負擔。LookML 提供 conditionally_filter 的形式,可解決這項問題。

除非使用者已為 unless 區段中列出的其中一個欄位新增篩選器,否則您可以使用 conditionally_filter 參數為查詢套用篩選器。

如果使用者對下列任一或多個欄位套用篩選器 (created_dateshipped_timeshipped_dateorders.idcustomer.name),下列範例就不會對使用者的查詢進行任何變更。如果使用者未針對任何欄位套用篩選條件,Looker 會自動在 orders.created_time 上新增 1 天的篩選器。

  filters: [orders.created_time: "1 day"]
  unless: [created_date, shipped_time, shipped_date, orders.id, customer.name]
}