Metabase 中的联接

如何在 Metabase 中使用 Notebook 编辑器在简单和自定义问题中联接表。

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

自动联接

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

我们将在下面深入探讨键,但现在,让我们看看隐式联接的实际应用。我们将使用 Metabase 随附的示例数据库作为数据,以便您可以亲自尝试。

  • 从顶部导航栏中,选择“+ 新建”。
  • 选择“问题”。
  • 选择“原始数据”>“示例数据库”作为您的数据源。
  • 然后选择 Orders 表。
  • 选择“可视化”,Metabase 将显示 Orders 表中的订单列表。
  • 单击屏幕左下角的“设置”按钮。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.

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

除了“可见列”,您还会看到一个名为“更多列”的部分。此部分将包含来自另外两个表的列:ProductsPeople。(我们将在文章后面解释为什么 Reviews 表明显缺失)。

Metabase 已经将 Orders 表“联接”到 Products 表和 People 表,这允许您从这些表中添加列。

例如,在此“设置侧边栏”中,向下滚动找到 Products 表,然后单击 CATEGORY 列旁边的“+”以将其添加到“可见列”中。您将在可见列中看到一个新列 Products → Category,其中 PRODUCT → 前缀表示该列并非 Orders 表的固有列。

通过单击 ID 列中的值并选择“查看详细信息”,您可以检查哪些表连接到该数据。例如,从 Orders 表中,您可以查看“产品 ID”列中条目的详细信息。Metabase 告诉我们,产品“Lightweight Wool Computer”(ID:146)连接到 Orders 表和 Reviews 表。

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,而不是“Lightweight Wool Computer”。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.

当查看 Orders 表时,外键 PRODUCT_ID 显示 Products 表的 TITLE 列中的值。

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

显式联接示例

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

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

如果我们添加 Products 表,Metabase 将自动填写外键关系,因为它知道字段 PRODUCT_ID 包含引用 Products 表的 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.

对于 Orders 表中的每一行,使用 PRODUCT_ID 列中的值在 Products 表的 ID 列中查找具有相同值的相应行,并返回一个新行,其中包含 Orders 表和 Products 表中列的值。

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

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

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

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

关系数据库

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

术语 描述 示例
实体 人物、订单、产品
该实体的属性 地址、描述、ID
该属性的实例 CA, 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 默认使用左联接

多重联接

有了这些关于表、键和联接的背景知识,让我们看看是否可以将 Orders 表链接到 Reviews 表。一般来说:如果我们的起始表(左表)不包含引用我们要联接的表的外键,我们该如何进行联接呢?

如果我们尝试将 Orders 表联接到 Reviews 表,Metabase 将不知道如何操作。

If there is no foreign key relationship, Metabase won

Orders 表缺少 Reviews 表的外键,这就是 Metabase 没有自动连接这两个表的原因。

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

The only foreign key in the Reviews table is PRODUCT_ID.

那么,这就是我们的情况:

  • Orders 表具有指向 ProductsPeople 表的外键。
  • Reviews 表具有指向 Products 表的外键。

要将 Orders 表连接到 Reviews 表,我们需要通过 Products 表进行联接。我们将使用查询构建器问题来指定联接。这是我们的问题:

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

请注意,在您指定键之前,Metabase 会将“上一个结果”显示为左侧的联接表。一旦您告诉 Metabase 将上一个结果在 Products.ID = Reviews.Product_ID 上进行联接,Metabase 将在“联接数据”部分显示 Products 表左联接到 Reviews 表。

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

多条件联接

现在让我们尝试向联接添加多个条件。如果您想减少重复行或表达单个条件联接无法表达的数据信息,这可能会很有用。假设我们想查看所有在产品添加到库存的同一个月下的订单。

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

如下所示,我们已将 Orders 表和 Products 表通过两个列(产品 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 表中的列供您添加,因此您现在可以随意使用完整的示例数据库。

尽情享受在您自己的数据集中联接表的乐趣吧,请记住:如果您遇到困难,请务必查阅数据浏览器,以了解哪些表具有您需要用于联接它们的外键。

下一篇:合并来自不同数据库的数据

如何在 Metabase 中联接来自不同数据库的表。

下一篇文章
© . All rights reserved.