虽然 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 的派生表,您可以在视图的 derived_table
参数中使用 sql
参数直接在 LookML 中定义 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 >“探索”齿轮菜单中的 Derived Table 选项,以获取 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 中的派生表。