本页介绍了 LookML 中的以下常见模式:
标记字段(以及界面中的名称)
Looker 会将 LookML 字段名称转换为界面显示的字符串,方法是将常规字体的视图名称与粗体的字段简称相结合。例如,“订单”视图中名为“金额”的字段在界面中会显示为“订单金额”。在此页面上,为了更清晰地说明问题,两个字段名称都以粗体显示,并且视图名称以大写形式显示 (ORDERS Amount)。
如果您希望某个字段的名称与表格中的列名称不同,请更改该字段的名称,并使用 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"]
}
百分比
许多关键效果指标都以百分比的形式表示,例如“退货商品的百分比”“促成销售的电子邮件的百分比”或“Y 占 X 的百分比”的其他实例。在 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 中,查询将如下所示:
用户状态 | 订单数 |
---|---|
加利福尼亚州 | 24 |
得克萨斯 | 5 |
科罗拉多 | 4 |
佛罗里达 | 4 |
伊利诺伊 | 4 |
如果您点击加利福尼亚行中的 24,您可能会看到来自加利福尼亚的 24 个订单。虽然 Looker 添加了过滤条件 USERS State: California,但 Looker 不知道您想在订单中显示哪些字段。您首先需要使用一个集合在模型中声明这些字段。
在 LookML 中,集是字段(维度、度量和过滤条件)名称的列表。您可以使用集为 Looker 提供以下信息:
- 在深入分析某个数量或其他衡量指标时要显示的字段
- 您在联接视图时要导入的字段
- 您希望在探索中编入索引的字段
由于同一组可以在模型中的多个位置使用,因此 Looker 提供了多种创建组的方法。
字面值集
从字面上看,集是一种在 LookML 中定义集的简单方法,尤其是在集仅使用一次时。通过将集合声明为数组来创建字面量集合。您可以使用 []
声明字面量集。
请参考以下示例:
view: customers {
dimension: id {
primary_key: yes
}
measure: count {
type: count
}
dimension: city {}
dimension: state {}
dimension: name {}
}
在此示例中,您要显示的字段为 id
、name
和 city
。
在衡量指标中,您可以按如下方式声明字面量数组:
measure: count {
type: count
drill_fields: [id, name, city]
}
命名集
假设在 customers
视图中定义了两个计数:count
和 in_california_count
。当用户在探索中深入查看数量字段或加利福尼亚州数量字段时,您希望显示 id
、name
和 city
字段。
最初,从字面上声明这些字段似乎就足够了:
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 管理员已启用可视化下钻实验室功能,Look 和探索下钻可视化图表将不再始终默认显示为数据表。在这种情况下,您可以使用 link
参数中的 Liquid 变量自定义显示的可视化图表,如 link
参数文档页面和更强大的数据下钻最佳实践页面所示。
信息中心支持使用 link
参数进行可视化下钻,而无需启用可视化下钻实验性功能。
过滤结果集
LookML 提供了一组可应用于字段和 Explore 的过滤操作,用于在将结果集返回给用户之前对其进行过滤。
“探索”中的 always_filter
使用 always_filter
可始终将一组过滤条件应用于在探索中运行的任何查询。这些过滤条件将显示在 Looker 界面中,虽然用户可以更改您提供的默认过滤条件值,但无法移除过滤条件。一般来说,这些过滤条件用于移除您通常不希望纳入的数据。例如,假设在订单探索中,您只想查看已完成或待处理的订单。您可以添加以下 LookML 代码:
explore: orders {
view_name: order
filters: [status: "complete,pending"]
}
}
如果用户想查看具有其他状态值的订单,可以在界面中将订单状态设置为 %。
“探索”中的 sql_always_where
如果您想应用用户无法更改的查询限制,可以使用 sql_always_where
。除了人工用户运行的查询之外,此限制还将应用于依赖于相应探索的信息中心、已安排的 Look 和嵌入式信息。除非用户查看其创建的任何查询的底层 SQL,否则系统不会向用户显示 sql_always_where
条件。
以下示例可防止用户查看 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
解决此问题的方法。
您可以使用 conditionally_filter
参数对查询应用过滤条件,除非用户已为 unless
部分中列出的某个字段添加了过滤条件。
如果用户对以下一个或多个字段应用了过滤条件,则以下示例不会对用户的查询做出任何更改:created_date
、shipped_time
、shipped_date
、orders.id
或 customer.name
。如果用户未对上述任何字段应用过滤条件,Looker 会自动对 orders.created_time
添加 1 天的过滤条件。
filters: [orders.created_time: "1 day"]
unless: [created_date, shipped_time, shipped_date, orders.id, customer.name]
}