引用模型和已保存的问题

对于 SQL 数据库,我们可以使用模型或现有问题作为新查询的基础,或者作为公共表表达式 CTE

例如,假设我们有大量数据分布在多个表中,但人们最感兴趣的是这些数据的子集。我们可以执行一次复杂的查询来返回这些结果,并将该问题保存为模型,人们可以在他们的查询中引用该模型,就像他们引用任何其他表一样。

在您键入时搜索模型和问题

首先,创建并保存一个问题或模型,该问题或模型返回您希望人们可以查询的结果集。

要在 SQL 查询中引用该问题或模型,请使用以 # 为前缀的变量中的类型提前搜索。

键入 {{#您的搜索词 }} ,Metabase 将显示与您的搜索词相关的模型和问题列表。

Typeahead search dropdown for referencing questions and models in SQL queries

您还可以通过在 Metabase 中导航到您想要在查询中引用的模型或问题来查找问题或模型 ID。ID 位于浏览器地址栏的 URL 中。ID 将是 /model//question/ 之后的数字。例如,对于 https://metabase.example.com/model/12345-example-name,模型的 ID 将为 12345

仅需要 #ID。Metabase 仅显示模型或问题名称,以使查询更具可读性。

模型、表或已保存的问题作为公共表表达式 (CTE)

相同的语法可用于 公共表表达式 (CTE)(适用于支持 CTE 的 SQL 数据库)

WITH gizmo_orders AS {{#5-gizmo-orders-in-2019}}
SELECT count(*)
FROM gizmo_orders

当此查询运行时,{{#5-gizmo-orders-in-2019}} 标签将被替换为被引用问题的 SQL 查询,并用括号括起来。因此,在底层它看起来像这样

WITH
  gizmo_orders AS (
    SELECT
      *
    FROM
      orders AS o
      INNER JOIN products AS p ON o.product_id = p.id
    WHERE
      p.category = 'Gizmo'
      AND o.created_at BETWEEN '2019-01-01' AND '2019-12-31'
  )
SELECT
  count(*)
FROM
  gizmo_orders

限制和权衡

  • 仅当使用 SQL 数据库(如 PostgreSQL、MySQL、Snowflake 或 SQL Server)时,才能在查询中引用模型或已保存的问题。
  • 您选择的模型或已保存的问题必须是基于与您当前在原生查询编辑器中选择的数据库相同的数据库。
  • 您无法引用子查询中的变量。您只能访问模型或已保存问题的结果,而不是模型或已保存问题的查询。例如,如果您有一个使用字段筛选器的已保存问题,您将无法引用该变量。如果您需要更改已保存问题筛选结果的方式,则需要更新(或复制)该问题并应用筛选器。

延伸阅读

阅读其他Metabase 版本的文档。