视图的 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 周岁及以上的用户定义为“老年人”。如需进行此除法,您必须使用 sql 表达式定义一个新维度(例如 dimension: age_cohort),用于捕获这些同类群组。以下 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:binbins 参数搭配使用,type: tiertiers 参数搭配使用,以将数值维度拆分为一组数值范围。需要权衡的是,您无法为每个分箱定义标签。

以下 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