檢視的 SQL 概念

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 的內建 bintier 參數類型。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