LookML 專案中的每個檢視區塊檔案,都會在 Looker 中定義單一檢視區塊,指定要查詢的資料表,以及該資料表中的哪些欄位 (維度和指標) 會顯示在 Looker 使用者介面中。檢視區塊會對應到資料庫中的單一資料表或單一衍生資料表。
本指南將說明下列主題:
如要進一步瞭解如何使用 SQL 在 LookML 中定義及自訂衍生資料表,請參閱衍生資料表的 SQL 概念。
檢視畫面
以下是名為 users.view
的檢視區塊檔案範例,其中包含要查詢的資料庫資料表定義,以及多個維度和指標:
view: users {
sql_table_name: thelook.users ;;
dimension: id {
primary_key: yes
type: number
sql: ${TABLE}.id ;;
}
dimension: age {
type: number
sql: ${TABLE}.age ;;
}
measure: average_age {
type: average
sql: ${age} ;; }
dimension_group: created {
type: time
timeframes: [raw, time, date, week, month, quarter, year]
sql: ${TABLE}.created_at ;;
}
measure: count {
type: count
}
}
檢視定義的第一個元素是 sql_table_name
參數,用於指定檢視畫面將查詢的資料庫表格。這是整個模型中唯一定義資料表名稱的位置,因為所有其他檢視區塊參照都會使用資料表別名 ${TABLE}
。如要變更資料庫資料表名稱,只需要變更 sql_table_name
參數。參照資料庫表格時,請注意以下事項。
Looker 會使用 sql_table_name
值撰寫 SQL FROM 子句,後面接著檢視區塊名稱,這會成為資料表別名。對應的 SQL 如下所示:
FROM `thelook`.`users` AS `users`
Looker 會使用檢視區塊定義的維度和指標,產生 SQL SELECT 子句。每個維度都會定義維度的類型,例如字串、數字或布林值,以及使用資料表別名參照檢視區塊內維度的 sql
LookML 參數。如要為名為 age
的維度建立篩選條件,請參閱以下範例:
dimension: age {
type: number
sql: ${TABLE}.age ;;
}
Looker 建立要傳送至資料庫的 SQL 時,會將檢視區塊的別名代入 ${TABLE}
。針對上一個範例中的 age
維度,Looker 會產生類似下列的 SELECT 子句:
SELECT `users`.`age` AS `users.age`
測量指標通常是對維度執行的彙整作業。您可以在指標的 sql
運算式中指定維度別名。舉例來說,計算 age
維度平均值的指標可能含有別名為 ${age}
的 sql
運算式,如下例所示:
dimension: age {
type: number
sql: ${TABLE}.age ;;
}
measure: average_age {
type: average
sql: ${age} ;;
}
如果重新命名 age
維度,新的別名會傳播至該維度的所有別名參照。
自訂檢視畫面檔案
您可以自訂檢視區塊檔案的 SQL 運算式,或使用 Looker 內建的 LookML 邏輯,模擬 SQL 運算式的邏輯。
使用 SQL 運算式
假設您想將年齡資料分成四個同類群組,將未滿 18 歲的使用者定義為「青少年」、18 至 35 歲的使用者定義為「年輕成人」、36 至 65 歲的使用者定義為「年長成人」,以及 65 歲以上的使用者定義為「年長者」。如要執行這項劃分作業,您必須定義新的維度 (例如 dimension: age_cohort
),並使用 sql
運算式擷取這些同類群組。下列 LookML 維度定義使用適用於 MySQL 資料庫連線的 CASE 陳述式:
dimension: age_cohort {
type: string
sql:
CASE
WHEN ${age} < 18 THEN 'Youth'
WHEN ${age} < 35 THEN 'Young Adult'
WHEN ${age} < 65 THEN 'Older Adult'
ELSE 'Senior'
END ;;
}
您已將年齡群組定義為維度,現在只要在探索查詢中加入年齡群組維度,即可重複使用 CASE 邏輯。
使用年齡群組維度建立探索查詢時,您可以透過「探索」的「SQL」分頁標籤查看 Looker 產生的 SQL。使用年齡群組維度時,SQL 看起來會像這樣:
SELECT
CASE
WHEN users.age < 18 THEN 'Youth'
WHEN users.age < 35 THEN 'Young Adult'
WHEN users.age < 65 THEN 'Older Adult'
ELSE 'Senior'
END AS `users.age_cohort`,
AVG(`age`) AS `users.average_age`,
COUNT(*) AS `users.count`
FROM
`thelook`.`users` AS `users`
GROUP BY
1
ORDER BY
2 DESC
LIMIT 500
使用 Looker 的內建大小寫邏輯
您可以使用與資料庫無關的運算式,達到與 SQL CASE 陳述式相同的效果。LookML case
參數可讓您定義由 when
陳述式組成的同類群組值區,這些陳述式會使用 sql
運算式擷取特定條件和字串,為結果加上標籤。
以下是使用 case
LookML 參數編寫的相同新 age_cohort
維度範例:
dimension: age_cohort {
case: {
when: {
sql: ${age} < 18 ;;
label: "Youth"
}
when: {
sql: ${age} < 35 ;;
label: "Young Adult"
}
when: {
sql: ${age} < 65 ;;
label: "Middle-aged Adult"
}
else: "Older Adult"
}
}
在執行階段,Looker 會為資料庫建構正確的 SQL CASE 語法。此外,Looker 會建構另一個運算式來處理群組排序,因此產生的標籤不會只是依字母數字排序 (除非您將排序順序定義為字母數字)。Looker 會建構類似下列內容的 SQL 查詢:
SELECT
CASE
WHEN users.age < 18 THEN '0'
WHEN users.age < 35 THEN '1'
WHEN users.age < 65 THEN '2'
ELSE '3'
END AS `users.age_cohort__sort_`,
CASE
WHEN users.age < 18 THEN 'Youth'
WHEN users.age < 35 THEN 'Young Adult'
WHEN users.age < 65 THEN 'Older Adult'
ELSE 'Senior'
END AS `users.age_cohort`,
AVG(`age`) AS `users.average_age`,
COUNT(*) AS `users.count`
FROM
`thelook`.`users` AS `users`
GROUP BY
1,
2
ORDER BY
1
LIMIT 500
使用 Looker 的內建容器或層級邏輯
如要指定數值的分組方式,也可以使用 Looker 的內建 bin
或 tier
參數類型。type:bin
會與 bins
參數搭配使用,type: tier
則會與 tiers
參數搭配使用,將數字維度分成一組數字範圍。但缺點是無法為每個資料夾定義標籤。
以下 LookML 範例會在維度中使用 bins
參數,定義每個集合中的最小值:
dimension: age_cohort {
type: bin
bins: [18,36,65]
style: integer
sql: ${age} ;;
}
您可以在維度中以完全相同的方式使用 tiers
參數。例如:
dimension: age_cohort {
type: tier
tiers: [18,36,65]
style: integer
sql: ${age} ;;
}
接著,Looker 會產生類似下列的 SQL 陳述式:
SELECT
CASE
WHEN users.age < 18 THEN '0'
WHEN users.age >= 18 AND users.age < 36 THEN '1'
WHEN users.age >= 36 AND users.age < 65 THEN '2'
WHEN users.age >= 65 THEN '3'
ELSE '4'
END AS `users.age_cohort__sort_`,
CASE
WHEN users.age < 18 THEN 'Below 18'
WHEN users.age >= 18 AND users.age < 36 THEN '18 to 35'
WHEN users.age >= 36 AND users.age < 65 THEN '36 to 64'
WHEN users.age >= 65 THEN '65 or Above'
ELSE 'Undefined'
END AS `users.age_cohort`,
AVG(`age`) AS `users.average_age`,
COUNT(*) AS `users.count`
FROM
`thelook`.`users` AS `users`
GROUP BY
1,
2
ORDER BY
1
LIMIT 500