如要編寫功能強大的 LookML,您必須能夠參照現有的維度、指標、檢視或衍生表格,即使這些項目不在目前範圍內也一樣。您也需要參照基礎資料表中的資料欄,並使用資料庫方言的函式呼叫來操作這些值。
替換運算子 ($)
替換運算子 $
可讓 LookML 程式碼更易於重複使用和模組化,方便您參照其他檢視畫面和衍生資料表、SQL 資料表中的欄,或 LookML 維度和評估項目。這麼做有兩個好處。首先,您可能已經處理過非常棘手的維度或評估,因此不需要再寫出所有複雜的內容。第二,如果您變更維度或資料表的某些內容,這些變更可能會傳播到所有依賴該維度或資料表的項目。
您可以透過多種方式使用替換運算子:
${TABLE}.column_name
會參照表格中與您要使用的檢視畫面連結的資料欄。例如:
dimension: customer_id {
type: number
sql: ${TABLE}.customer_id ;;
}
${field_name}
會參照您正在使用的檢視畫面中的維度或指標。例如:
measure: total_population {
type: sum
sql: ${population} ;;
}
${view_name.field_name}
會參照其他檢視畫面的維度或測量指標。例如:
dimension: lifetime_orders {
type: number
sql: ${user_order_facts.lifetime_orders} ;;
}
${view_name.SQL_TABLE_NAME}
會參照其他檢視畫面或衍生資料表。請注意,此參照中的 SQL_TABLE_NAME
是字面字串,您不需要用任何內容取代它。例如:
explore: trips {
view_label: "Long Trips"
# This will ensure that we only see trips that are longer than average!
sql_always_where: ${trips.trip_duration}>=(SELECT tripduration FROM ${average_trip_duration.SQL_TABLE_NAME});;
}
${view_name.SQL_TABLE_NAME}
與 datagroups 搭配使用的sql_trigger
參數不相容。
範圍和命名
您可以為探索、檢視畫面、欄位和集合命名。這些 Looker ID 不含引號。
LookML 欄位和集合有全名和簡稱:
- 完整名稱的格式為
<view>.<field-name | set-name>
。左側代表範圍,也就是包含欄位或集合的檢視畫面。右側會指定特定欄位或集合名稱。 - 簡稱的格式為
<field-name | set-name>
,不含分隔點。Looker 會使用簡短名稱的使用範圍,將簡短名稱展開為完整名稱。
以下範例說明許多形式的名稱和範圍。這組欄位並非真實的例子,而是用來展示各種可能的範圍運算式。
view: orders { # "orders" becomes the containing scope
measure: count { # short name, equivalent to orders.count
type: count
}
dimension: customer_id { # short name, equivalent to orders.customer_id
type: number
sql: ${TABLE}.customer_id ;;
}
dimension: customer_address { # short name, equivalent to orders.customer_address
sql: ${customer.address} ;; # full name, references a field defined in the "customer" view
}
set: drill_fields { # short name, equivalent to orders.drill_fields
fields: [
count, # short name, equivalent to orders.count
customer.id # full name, references a field defined in the "customer" view
]
}
}
請注意,在 dimension: customer_address
宣告中,SQL 區塊的基礎檢視畫面 (customer
) 與包函的檢視畫面範圍 (orders
) 不同。如果您需要比較兩個不同檢視畫面之間的欄位,這項功能就很實用。
當檢視畫面 (我們稱為「檢視畫面 A」) 參照在其他檢視畫面 (我們稱為「檢視畫面 B」) 中定義的欄位時,請注意以下幾點:
- 檢視 B 檔案必須使用
include
參數,納入與檢視 A 相同的模型。 - 資料檢視 B 必須與一或多個探索中的資料檢視 A 彙整。請參閱「在 LookML 中使用彙整」頁面,進一步瞭解彙整。
SQL 方言
Looker 支援多種資料庫類型,例如 MySQL、Postgres、Redshift、BigQuery 等等。每個資料庫支援的功能集和函式名稱略有不同,這稱為 SQL 方言。
LookML 可搭配所有 SQL 方言使用,且不會偏好某種方言。不過,您需要在特定 LookML 參數中加入 SQL 程式碼運算式 (稱為 SQL 區塊)。透過這些參數,Looker 會直接將 SQL 運算式傳遞至資料庫,因此您必須使用與資料庫相符的 SQL 方言。舉例來說,如果您使用 SQL 函式,該函式必須是資料庫支援的函式。
SQL 區塊
部分 LookML 參數需要您提供原始 SQL 運算式,讓 Looker 瞭解如何從資料庫擷取資料。
以 sql_
開頭的 LookML 參數會預期某種形式的 SQL 運算式。例如:sql_always_where
、sql_on
和 sql_table_name
。SQL 區塊最常見的 LookML 參數是 sql
,用於維度和資料欄定義,用來指定定義維度或資料欄的 SQL 運算式。
您在 SQL 區塊中指定的程式碼可以是單一欄位名稱這麼簡單,也可以是相關聯的子查詢這麼複雜。內容可能相當複雜,幾乎可滿足您在原始 SQL 中表達自訂查詢邏輯的任何需求。請注意,您在 SQL 區塊中使用的程式碼必須與資料庫使用的 SQL 方言相符。
維度和測量指標的 SQL 區塊範例
以下是維度和測量指標的 SQL 區塊範例。LookML 替換運算子 ($) 可能會讓這些 sql
宣告看起來不像 SQL。不過,在替換完成後,產生的字串會是純 SQL,Looker 會將這項資訊插入查詢的 SELECT
子句中。
dimension: id {
primary_key: yes
sql: ${TABLE}.id ;; # Specify the primary key, id
}
measure: average_cost {
type: average
value_format: "0.00"
sql: ${order_items.cost} ;; # Specify the field that you want to average
}
dimension: name {
sql: CONCAT(${first_name}, ' ', ${last_name}) ;;
}
dimension: days_in_inventory {
type: int
sql: DATEDIFF(${sold_date}, ${created_date}) ;;
}
如最後兩個維度所示,SQL 區塊可使用底層資料庫支援的函式 (例如本例中的 MySQL 函式 CONCAT
和 DATEDIFF
)。
含有相關聯子查詢的 SQL 區塊範例
您可以在欄位的 SQL 區塊中放入任何 SQL 陳述式,包括相關聯的子查詢。以下為範例:
view: customers {
dimension: id {
primary_key: yes
sql: ${TABLE}.id ;;
}
dimension: first_order_id {
sql: (SELECT MIN(id) FROM orders o WHERE o.customer_id=customers.id) ;;
# correlated subselect to derive the value for "first_order_id"
}
}
衍生資料表的 SQL 區塊範例
衍生資料表會使用 SQL 區塊指定衍生資料表的查詢。以下為範例:
view: user_order_facts {
derived_table: {
sql: # Get the number of orders for each user
SELECT
user_id
, COUNT(*) as lifetime_orders
FROM orders
GROUP BY 1 ;;
}
# later, dimension declarations reference the derived column(s)
dimension: lifetime_orders {
type: number
}
}
LookML 欄位類型參照
在其他欄位中參照現有的 LookML 欄位時,您可以使用雙冒號 (::
) 後接所需類型,指示 Looker 將參照的欄位視為特定資料類型。舉例來說,如果您在其他欄位中參照 orders.created_date
維度,可以使用 ${orders.created_date::date}
語法,確保 created_date
欄位在 Looker 產生的 SQL 中會視為日期欄位,而非轉換為字串。
您可以在參照中使用的資料類型取決於您參照的原始欄位資料類型。舉例來說,如果您參照的是字串欄位,則您只能指定 ::string
資料類型。以下是可用於每種欄位類型的完整欄位類型參照清單:
- 在字串欄位參照中,您可以使用
::string
。 - 在參照數值欄位時,您可以使用
::string
和::number
。 - 在日期或時間欄位參照中,您可以使用
::string
、::date
和::datetime
。使用::string
和::date
的參照會傳回查詢時區的資料,而使用::datetime
的參照會傳回資料庫時區的資料。 - 在是/否欄位的參照中,您可以使用
::string
、::number
和::boolean
。使用::boolean
類型的欄位參照不適用於不支援布林值資料類型的資料庫方言。 - 在位置欄位的參照中,您可以使用
::latitude
和::longitude
。
使用 LookML 欄位類型參照日期欄位
舉例來說,假設您有 enrollment_month
維度和 graduation_month
維度,兩者都是在 type: time
的維度群組內建立。在這個範例中,enrollment_month
維度是由 type: time
的下列維度群組產生:
dimension_group: enrollment {
type: time
timeframes: [time, date, week, month, year, raw]
sql: ${TABLE}.enrollment_date ;;
}
同樣地,graduation_month
維度是由 type: time
的下列維度群組建立:
dimension_group: graduation {
type: time
timeframes: [time, date, week, month, year, raw]
sql: ${TABLE}.graduation_date ;;
}
您可以使用 enrollment_month
和 graduation_month
維度,建立 type: duration
維度群組,計算學生入學和畢業之間相隔了多少個月或年。不過,由於部分日期欄位會在 Looker 產生的 SQL 中轉換為字串,因此將 enrollment_month
和 graduation_month
維度設為 sql_start
和 sql_end
的值,可能會導致錯誤。
為避免這些時間欄位轉換為字串而導致錯誤,您可以建立 type: duration
的維度群組,參照 sql_start
和 sql_end
參數中 enrollment
和 graduation
維度群組的 raw
時間範圍:
dimension_group: enrolled {
type: duration
intervals: [month, year]
sql_start: ${enrollment_raw} ;;
sql_end: ${graduation_raw} ;;
}
在「探索」使用者介面中,這會產生名為「註冊時間長度」的維度群組,其中包含「註冊月份」和「註冊年數」等個別維度。
在 type: duration
的維度群組中使用 raw
時間範圍的簡單替代方案,是為 sql_start
和 sql_end
參數中參照的欄位指定 ::date
或 ::datetime
參照類型。
dimension_group: enrolled {
type: duration
intervals: [month, year]
sql_start: ${enrollment_month::date} ;;
sql_end: ${graduation_month::date} ;;
}
這個範例中的 LookML 也會建立「Duration Enrolled」維度群組,但使用 ::date
參照可讓您使用 enrollment_month
和 graduation_month
維度,而無須使用 raw
時間範圍,或將這些維度轉換為 SQL 字串。
如需其他範例,瞭解如何使用 LookML 欄位類型參照來建立 type: duration
的自訂維度群組,請參閱 dimension_group
參數說明文件頁面。
這個語法不適用於
type: list
的措施,因為 Looker 6.8 無法參照該措施。
LookML 常數
constant
參數可讓您指定可在整個 LookML 專案中使用的常數。使用 LookML 常數,您可以一次定義一個值,並在專案中任何可接受字串的部分參照該值,藉此減少 LookML 程式碼中的重複內容。
常數必須在專案資訊清單檔案中宣告,且常數的值必須為字串。舉例來說,您可以定義常數 city
,其值為 "Okayama"
,如下所示:
constant: city {
value: "Okayama"
}
接著,您可以使用 @{city}
語法在整個專案中參照 city
常數。舉例來說,您可以在 users
Explore 中使用 city
常數搭配 label
參數:
explore: users {
label: "@{city} Users"
}
接著,Looker 會在「探索」選單和「探索」標題中顯示「岡山使用者」,而非預設的「使用者」。
如要進一步瞭解如何使用 LookML 常數編寫可重複使用的程式碼,請參閱 constant
參數說明文件頁面。