本页将介绍 LookML 中较为常见的模式。
为字段(以及界面中的名称)添加标签
Looker 会将常规粗细字体的视图名称与以粗体显示的字段简称合并在一起,将 LookML 字段名称转换为界面中显示的字符串。例如,订单视图中名为金额的字段在界面中显示为“订单金额”。在这个页面上,页面以粗体显示,视图名称采用首字母大写形式(订单金额),以便进行更清晰的讨论。
如果您希望字段的名称与表格中的列名称不同,只需更改字段名称并声明其 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 |
如果点击 California 行中的 24,我们预期会看到 24 个来自加利福尼亚州的订单。
Looker 负责添加“用户状态:加利福尼亚州”这个过滤器,但 Looker 并不知道您要在订单中显示哪些字段。您需要使用集来声明模型中的这些字段。
在 LookML 中,集是一个字段(维度、衡量和过滤条件)名称列表。集用于告知 Looker 哪些字段:
- 您希望在深入统计计数或其他衡量指标时显示
- 联接视图时导入
- 已在“探索”标签页中编入索引
同一集合可在模型的许多位置使用,因此 Looker 提供了多种创建集合的方式。
字面量集
集最简单的形式是字面量集。如需创建字面量集,只需将集合声明为数组即可。您可以使用“[]”来声明字面量集。
举个例子:
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 和 CUSTOMERS 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"]
}
}
如果要添加新的字段(例如字段 customers.state
),则必须修改这两个列表。不过,LookML 提供了一种方法来创建命名集,我们可以在一处集中维护它并在多个位置使用。
以下代码会创建一组 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"]
}
}
LookML 集非常强大:
- 重新声明集是可累加的 - 如果您在多个位置声明一个集,那么 Looker 会包含在所有位置为集声明的所有字段。
- 您可以在其他集中嵌入集,方法是:输入其他集的名称,后跟星号,例如
setname*
。 - 您甚至可以在字段名称前面添加一个连字符,将其从集合中移除,例如
-fieldname
。
自定义深入分析可视化图表
如果您的 Looker 管理员启用了可视化深入分析实验室功能,则“探索”和“探索”深入分析可视化图表并不总是默认显示数据表格。在这种情况下,您可以使用 link
参数中的 Liquid 变量来自定义显示的可视化图表,如 link
参数文档页面和功能更强大的数据深入分析页面中所示。
信息中心支持使用 link
参数进行可视化深入分析,而无需启用可视化深入分析功能。
过滤结果集
LookML 提供了一组可应用于字段的过滤器操作,探索功能可在将结果集返回给用户之前对其进行过滤。
“探索”上的always_filter
使用 always_filter
始终为“探索”中运行的任何查询应用一组过滤条件。这些过滤条件会显示在 Looker 界面中,虽然用户可以更改您提供的默认过滤条件值,但他们无法移除过滤条件。这些过滤器通常用于移除您通常不希望包含的数据。例如,假设订单探索中我们只想查看已完成或待处理的订单。我们可以添加以下内容:
explore: orders {
view_name: order
filters: [status: "complete,pending"]
}
}
如果用户想查看处于其他状态值的订单,可以在界面中将 ORDERS 状态设置为 %。
“探索”上的sql_always_where
如果您想应用用户无法更改的查询限制,可以使用 sql_always_where
。除了人工用户运行的查询之外,此限制将应用于依赖于该“探索”的信息中心、预定外观和嵌入信息。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
的形式解决此问题。
您可以使用 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]
}