在Metabase中的连接

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

在数据分析中,连接(Join)是不可避免的。使用Metabase,我们试图使您获取问题的答案尽可能容易——即使这需要一些更复杂的策略。在本文中,我们将介绍如何在Metabase中使用查询构建器连接表,并为您提供一些关于关系数据库、表和键的背景知识,以便您更好地理解连接是如何工作的。

自动连接

SQL中的连接允许您将多个表中的数据结合起来。尽可能的情况下,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表与ProductsPeople表,这使得您可以添加这些表的列。

例如,从这个设置侧边栏中向下滚动以找到Products表,然后单击+旁边的CATEGORY列,将其添加到可见列中。您将在可见列中看到一个新列,Products → Category,其前缀PRODUCT →表明该列不是Orders表的本地列。

通过单击ID列中的一个值并选择查看详情,您可以检查连接到该数据哪些表。例如,从Orders表,您可以查看Product ID列中的条目详情。Metabase告诉我们,产品“轻质羊毛电脑”(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,而不是“轻质羊毛电脑”。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列中查找具有相同值的对应行,并返回一个包含来自OrdersProducts表列的新行。

如果你感兴趣,这里就是底下的基本SQL

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

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

在上面的问题模式下,你可能已经注意到你不能从样本数据库中的一个表(Reviews表)中添加列。为了理解原因,我们需要了解一些关于关系型数据库的背景知识。

关系型数据库

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

术语 描述 示例
实体 人,订单,产品
该实体的属性 地址,描述,ID
该属性的实例 CA,7,“轻质羊毛电脑”

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

连接的键

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

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

让我们用Metabase的Data Browser来查看示例数据库中的示例表的几个键。在Metabase的顶部导航栏中,转到Browse Data,然后点击示例数据库。您将看到每个表的卡片。将鼠标悬停在卡片上以查看更多选项,然后点击出现在Learn about this table旁边的book icon

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

此表引用页面包含多个选项卡

  • 详细信息
  • 表中的字段
  • 有关此表的疑问
  • 检查此表

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

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将在“连接数据”部分显示与评论表左连接的“产品”表。

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

具有多个条件的连接

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

以上面相同的例子作为起点,点击第一个条件旁边的蓝色+按钮以在同一个连接中添加另一个条件。您在这里应该使用内连接,因为这只会返回两个表中匹配的值。

如下面所示,我们已经根据产品ID和创建日期在两个列上连接了OrdersProducts表,因此现在我们可以看到所有在产品被添加到我们库存的同一月份下订单的订单。

请注意,虽然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表的列可用,因此您现在可以使用完整的样本数据库。

在您的数据集中享受连接表,并记住:如果您卡住了,务必查阅数据浏览器,了解哪些表有您需要连接的外键。

下一部分:多级聚合

如何使用查询构建器提出包含多个部分的问题。

下一篇文章