Metabase 中的联接

如何在 Metabase 中使用笔记本编辑器在简单和自定义查询中连接表格。

连接是分析数据时不可避免的操作,Metabase 致力于让您尽可能轻松地找到问题的答案,即使这需要一些更复杂的策略。本文将介绍如何在 Metabase 中使用查询构建器连接表格,并提供关于关系数据库、表格和键的一些背景知识,以便您更好地理解连接的工作原理。

自动连接

连接允许您组合来自多个表格的数据。在可能的情况下,Metabase 会为您创建这些连接,使人们可以轻松地跨多个表格处理数据。您必须在数据模型中定义外键关系,Metabase 才能检测到这些关系并在数据模型中连接这些表格。如果这些外键未配置,管理员始终可以使用数据模型部分来指定这些关系。

我们将在下面深入介绍键,但现在,让我们看看一个隐式连接的实际应用。我们将使用 Metabase 随附的示例数据库作为数据,这样您就可以亲自尝试。

  • 从顶部导航栏中,选择 + 新建
  • 选择问题
  • 选择原始数据 > 示例数据库作为您的数据源。
  • 然后选择订单表。
  • 选择可视化,Metabase 将显示来自订单表的订单列表。
  • 点击屏幕左下角的设置按钮。Metabase 将滑出表格选项侧边栏,并为您提供可供选择的列列表。

Orders table with the Settings sidebar open to the Table options section. You can add, remove, and edit columns, including More columns from tables that Metabase can automatically join to the Orders table.

可见列是问题查询中当前包含的列,在本例中包含订单表中的所有列。您可以添加和删除列,并更改列设置(具体取决于列的字段类型)。

除了可见列,您还会看到一个名为更多列的部分。此部分将包含来自其他两个表的列:产品人员。(我们稍后会在文章中解释为什么评论表明显缺失)。

Metabase 已经将订单表与产品表和人员表“连接”起来,这允许您从这些表中添加列。

例如,在此设置侧边栏中,向下滚动以找到产品表,然后单击CATEGORY列旁边的+将其添加到可见列。您将在可见列中看到一个新列产品 → 类别,前缀产品 →表示该列不属于订单表。

通过单击 ID 列中的值并选择查看详细信息,您可以检查哪些表与该数据连接。例如,从订单表,您可以查看产品 ID 列中条目的详细信息。Metabase 告诉我们,产品“轻质羊毛电脑”(ID:146)连接到订单表和评论表。

Clicking on a value in an ID column and selecting View details will show you, among other data, which tables the record is connected to.

请注意,实际的产品 ID 值是 146,而不是“轻质羊毛电脑”。Metabase 允许管理员更改列值的显示方式

The field settings for the PRODUCT_ID field in the Orders table. Admins can use the Display values setting to display a human-readable title instead of an ID.

查看订单表时,外键PRODUCT_ID显示产品TITLE列中的值。

我们将在下面深入探讨键,但首先让我们看看显式连接。

显式连接示例

让我们尝试一个简单的连接。我们将通过单击+ 新建 > 问题 > 原始数据 > 示例数据库来创建新问题。我们将选择订单表。在数据部分,单击连接图标以添加另一个表。

To add tables to your question, click on the join icon (the Venn Diagram).

如果我们添加产品表,Metabase 将自动填写外键关系,因为它知道字段PRODUCT_ID包含引用产品ID列(实体键)中值的外键。

Joining the Orders table to the Products table by linking the foreign key (PRODUCT_ID) in the Orders table to the entity key (ID) in the Products table.

对于订单表中的每一行,使用PRODUCT_ID列中的值来查找产品ID列中具有相同值的相应行,并返回一个新行,其中包含订单产品表中的列值。

如果您有兴趣,以下是幕后工作的基本 SQL

SELECT
  *
FROM
  Orders
  LEFT JOIN Products ON Orders.PRODUCT_ID = Products.ID

(请注意,如果您将问题转换为 SQL,您将获得一个更复杂的 SQL 查询,但两个查询都返回相同的数据。)

您可能已经注意到,在上面的问题模式中,您无法从示例数据库中的某个表(即Reviews表)添加列。为了理解原因,我们需要一些关系数据库的背景知识。

关系型数据库

关系型数据库(如 PostgreSQL 和 MySQL)将数据存储在表中(关系),这些表通常代表某种实体,如订单或产品。这些表由列(实体的属性)和行(有时称为记录)组成。如果您以前使用过电子表格软件,那么表类似于具有列和行的工作表。

术语 描述 示例
表格 实体 人物、订单、产品
该实体的属性 地址、描述、ID
该属性的实例 加利福尼亚州、7、“轻质羊毛电脑”

其中一些列包含特殊属性,称为键。

连接的关键

每个表都有一列特殊的列,其中包含不同的键,称为实体键主键,它们唯一标识表中的每一行。这些列通常包含 ID 号,它们可以由数据库自动生成,也可以由应用程序生成(例如,员工 ID)。

第二种类型的键,称为外键,存储对另一个表中行实体键的引用。要连接表,您将使用外键和实体键来告诉数据库如何组合来自多个表的数据。

让我们使用 Metabase 的数据浏览器来查看示例数据库中某个示例表的一些键。从 Metabase 顶部导航栏中,转到浏览数据,然后单击示例数据库。您将看到每个表的卡片。将鼠标悬停在卡片上以查看其他选项,然后单击了解此表旁边出现的书本图标

Go to Browse Data from the top navigation bar, select Sample Database, and click on the book icon to learn about this table.

此表参考页包含多个选项卡

  • 详细信息
  • 此表中的字段
  • 关于此表的问题
  • X 射线此表

选择此表中的字段选项卡以查看表中每个字段的字段名称、字段类型和数据类型。

Select Fields in this table tab to view the field name, field type, and data type. The Orders table contains an entity key (ID) and two foreign keys, USER_ID and PRODUCT_ID.

Orders表包含一个实体键(即主键)ID和两个外键:USER_IDPRODUCT_ID

  • 外键USER_IDPeople表的实体键ID相关联。
  • 外键PRODUCT_IDProducts表的实体键ID相关联。

我们可以通过这些键连接OrdersPeopleProducts的数据。连接只是指示 Metabase 对齐一个表的记录,并使用每行中的外键值通过查找具有匹配实体键值的相应行来组合来自另一个表的数据。

Metabase 默认为左连接

多重连接

有了关于表格、键和连接的背景知识,让我们看看是否可以将订单表与评论表链接起来。概括地说:如果我们的起始表(左表)不包含引用我们要连接的表的外键,我们该如何连接它们?

如果我们尝试将订单表连接到评论表,Metabase 将不知道如何处理。

If there is no foreign key relationship, Metabase won

订单表缺少评论表的外键,这就是 Metabase 未自动连接这两个表的原因。

让我们转向数据浏览器,找出评论表包含哪些外键。

The only foreign key in the Reviews table is PRODUCT_ID.

所以,我们的情况是这样的

  • 订单表具有指向产品人员表的外键。
  • 评论表具有指向产品表的外键。

要连接订单表到评论表,我们需要通过产品表进行连接。我们将使用查询构建器问题来指定连接。以下是我们的问题:

Joining the Orders table to the Reviews table via the Products table.

请注意,Metabase 将“以前的结果”显示为要连接的左表,直到您指定键。一旦您告诉 Metabase 在Products.ID = Reviews.Product_ID上连接以前的结果,Metabase 将在“连接数据”部分中显示左连接到“评论”表的“产品”表。

如果您可视化结果,您将看到一个包含所有三张表(OrdersProductsReviews)所有列的表格。请注意,由于单个产品可以有多个评论,我们将看到同一产品和订单的多行,每条评论对应一行。

多条件连接

现在让我们尝试为连接添加多个条件。这有助于减少重复行或表达单个条件连接无法表达的数据信息。假设我们想查看所有在产品添加到库存的同一个月下的订单。

以上述示例为起点,单击第一个条件旁边的蓝色 + 按钮,在同一连接中添加另一个条件。您将需要在此处使用内连接,因为这只会返回两个表中匹配的值。

如下所示,我们已将订单表和产品表连接到两个列:产品 ID 和创建日期,因此我们现在可以看到所有在产品添加到库存的同一个月下的订单。

请注意,虽然CREATED_AT字段包含完整的日期和时间信息,但这些结果表示的是月份匹配,而不是确切的时间戳。

Joining the Orders table to the Products table by linking the foreign key (PRODUCT_ID) in the Orders table to the entity key (ID) in the Products table <em>and</em> by creation date.

列选择

除了连接表之外,我们还可以选择在问题结果中显示哪些列。在查询构建器中,您可以选择 Metabase 显示的列。

Selecting columns in the Query Builder.

保存问题后,您也可以像上面那样从设置侧边栏中选择可见列。

Click the Settings button to add or remove columns from your question.

您会注意到,Metabase 也提供了People表中的列供您添加,因此您现在可以使用完整的示例数据库。

尽情连接您自己的数据集中的表格吧,请记住:如果遇到困难,请务必查阅数据浏览器,了解哪些表格具有您需要的连接外键。

这有帮助吗?

感谢您的反馈!
分析师每周技巧
获取可行的见解
关于 AI 和数据的资讯,直接发送到您的收件箱
© . This site is unofficial and not affiliated with Metabase, Inc.