常见的 LookML 模式

本页介绍了 LookML 中的以下常见模式:

为字段添加标签(以及界面中的名称)

Looker 会将 LookML 字段名称转换为界面显示的字符串,方法是将采用常规粗细字体的视图名称与采用粗体字体的字段简称组合在一起。例如,Orders 视图中名为 Amount 的字段在界面中会显示为 Orders Amount。在本页中,我们将两个字段名称都加粗,并将视图名称转换为大写形式(ORDERS 金额),以便更清晰地进行讨论。

如果您希望某个字段的名称与表格中的列名称不同,请更改字段名称,然后使用 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) 会将零值转换为 null,这会使结果为 null 并避免出现错误。

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

使用集进行展开细目

Looker 最强大的功能之一是能够深入数据,查看构成计数或其他测量的底层实体。

当您在界面中点击某个指标时,Looker 会创建一个新查询,以本地化构成该指标的一组数据。表格中某行每个维度的每个值都会添加到

如需显示详细信息,Looker 需要在用户点击某个衡量值时显示指定的展开字段列表。当您生成模型时,生成器通常会为您创建一些初始展开字段。此外,您还可以自行添加展开字段。例如,假设您要按“用户状态”衡量上周的订单数在 Looker 中,该查询将如下所示:

USERS 状态订单数
加利福尼亚州24
得克萨斯州5
科罗拉多4
佛罗里达4
伊利诺伊4

如果您点击加利福尼亚州行中的 24,可能会看到来自加利福尼亚州的 24 笔订单。虽然 Looker 会添加过滤条件 USERS State: California,但它不知道您想在订单中显示哪些字段。您首先需要使用 set 在模型中声明这些字段。

在 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。当用户在“探索”中展开计数字段或在加利福尼亚州的计数字段时,您希望显示 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 管理员启用了可视化钻研实验室功能,那么“查看”和“探索”中的钻研可视化图表不会始终默认显示为数据表格。在这种情况下,您可以在 link 参数中使用 Liquid 变量来自定义显示的可视化图表,如 link 参数文档页面和更强大的数据钻取最佳实践页面所示。

信息中心支持使用 link 参数进行直观钻研,而无需启用直观钻研实验室功能。

过滤结果集

LookML 提供了一组过滤操作,可应用于字段和探索,以便在将结果集返回给用户之前对其进行过滤。

“探索”页面上的 always_filter

使用 always_filter 可始终对在“探索”中运行的任何查询应用一组过滤条件。这些过滤条件将显示在 Looker 界面中,虽然用户可以更改您提供的默认过滤条件值,但无法移除过滤条件。通常,这些过滤器用于移除您通常不想包含的数据。例如,假设您只想在订单探索中查看已完成或待处理的订单。您可以添加以下 LookML 代码:

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

如果用户想查看其他状态值的订单,可以在界面中将 ORDERS Status 设置为 %

“探索”页面上的 sql_always_where

如果您想应用用户无法更改的查询限制,可以使用 sql_always_where。除了由人工用户运行的查询之外,此限制还会应用于信息中心、定期生成的 Look 以及依赖于该探索的嵌入信息。系统不会向用户显示 sql_always_where 条件,除非用户查看自己创建的任何查询的底层 SQL。

以下示例会阻止用户查看 2012 年 1 月 1 日之前的订单:

# 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]
}