虽然 LookML 视图通常基于数据库中的现有表,但您也可以创建基于 SQL SELECT
语句的视图。在 Looker 中,此类视图称为“派生表”。派生表是指其结果的使用方式与数据库中的实际表相同的查询。
在本指南中,您将了解以下主题:
Looker 如何为派生表生成 SQL
在 LookML 中查询派生表时,Looker 会将您的查询转换为 SQL 语句,具体取决于方言,这些语句可以是通用表表达式 (CTE) 或内嵌视图。换句话说,生成的 SQL 查询可能类似于以下示例之一。
以下示例展示了 Looker 如何生成使用 CTE 查询派生表的 SQL 查询:
WITH (
SELECT o.user_id as id
FROM orders AS o
INNER JOIN order_items AS oi ON o.id == oi.order_id
ORDER BY SUM(oi.total_sale_price) DESC
GROUP BY o.customer_id
LIMIT 100
) AS top_100_users
SELECT ...
FROM users AS u
INNER JOIN top_100_users ON u.id == top_100_users.id
WHERE ...
以下示例展示了 Looker 如何生成使用内嵌视图查询派生表的 SQL 查询:
SELECT ...
FROM users AS u
INNER JOIN (
SELECT o.user_id as id
FROM orders AS o
INNER JOIN order_items AS oi ON o.id == oi.order_id
ORDER BY SUM(oi.total_sale_price) DESC
GROUP BY o.customer_id
LIMIT 100
) AS top_100_users ON u.id == top_100_users.id
WHERE ...
基于 SQL 的派生表
如需创建基于 SQL 的派生表,您可以直接在 LookML 中定义 SQL 查询,方法是使用视图的 derived_table
参数中的 sql
参数。这样,您就可以使用 SQL 定义派生表的列。
例如,以下 LookML 示例定义了一个名为 top_100_users
的派生表,用于确定所有订单总支出最高的前 100 位用户:
view: top_100_users {
derived_table: {
sql: SELECT o.user_id as id
FROM orders AS o
INNER JOIN order_items AS oi ON o.id == oi.order_id
ORDER BY SUM(oi.total_sale_price) DESC
GROUP BY o.customer_id
LIMIT 100 ;;
}
dimension: id {
type: number
sql: ${TABLE}.id ;;
}
}
当“探索”查询中引用 top_100_users
视图时,Looker 会在生成的 SQL 中将此 SQL SELECT
语句用作 CTE 或内嵌视图,具体取决于您的方言。
使用 SQL 定义派生表可能会受到一些限制。例如,在“基于 SQL 的派生表”部分中的示例中,请遵循以下注意事项:
orders
表和order_items
表之间的关系可能已在 LookML 模型中定义。如果数据库中的底层表名称发生变化,则必须在多个位置更新表名称,包括基于 SQL 的派生表的定义中。- 派生表定义中的 SQL 必须采用底层数据库的正确方言。如果数据移至其他数据库,则需要更改基于 SQL 的派生表的定义。
因此,原生派生表通常是更好的选择。
原生派生表
在 Looker 中,原生派生表是使用 LookML 定义的。与使用基于 SQL 的派生表相比,定义原生派生表时,您会以以下方式利用 LookML 模型:
- 如果数据库中的表名称发生变化,您只需在 LookML 模型中更新一次即可。由于原生派生表指向定义数据库表的现有 LookML 对象,因此原生派生表会自动引用相应表。
- 同样,如果您改用其他方言,原生派生表的 LookML 仍会有效,因为 Looker 会生成适合您的数据库连接的 SQL。
您可以手动为原生派生表定义 LookML。不过,创建原生派生表的最简单方法是让 Looker 根据“探索”查询创建派生表。在“探索”中,选择要在派生表中使用的字段,然后依次选择“探索”齿轮菜单中的获取 LookML > 派生表选项以获取 LookML。Looker 会生成您需要的 LookML,以便您根据探索查询创建派生表,包括 LookML 模型中用于创建派生表的列所需的相关字段定义。您可以将 LookML 复制到项目中的视图文件中,以创建派生表。
以下示例展示了一个原生派生表,用于确定在所有订单中的总支出最高的前 100 名用户:
view: top_100_users {
derived_table: {
explore_source: orders {
column: id {
field: orders.customer_id
}
sorts: [order_items.sum_total_sale_price desc]
limit: 100
}
}
}
在探索中查询原生派生表时,系统会自动生成原生派生表的 SQL 查询的所有详细信息。具有原生派生表的 LookML 视图的列定义会从底层探索的定义中推断出来,因此无需重复任何定义。
永久性派生表 (PDT)
在 Looker 中,您可以创建临时派生表和永久派生表。创建基于 SQL 的派生表或原生派生表后,您可以添加持久性,以便 Looker 将表写入数据库中的临时架构,并按您指定的时间表重新生成该表。如需了解详情,请参阅 Looker 中的派生表。