在Metabase中的连接
如何在Metabase中使用笔记本编辑器在简单和自定义问题中连接表。
在数据分析中,连接(Join)是不可避免的。使用Metabase,我们试图使您获取问题的答案尽可能容易——即使这需要一些更复杂的策略。在本文中,我们将介绍如何在Metabase中使用查询构建器连接表,并为您提供一些关于关系数据库、表和键的背景知识,以便您更好地理解连接是如何工作的。
自动连接
SQL中的连接允许您将多个表中的数据结合起来。尽可能的情况下,Metabase会为您建立这些连接,使得人们可以轻松地在多个表之间工作。您需要在您的数据模型中定义外键关系,以便Metabase检测这些关系并在数据模型中连接这些表。如果这些外键未配置,管理员始终可以使用数据模型部分来指定这些关系。
我们将在下面详细介绍键,但现在,让我们看看隐式连接的实际应用。我们将使用Metabase附带样本数据库作为我们的数据,以便您可以亲自尝试。
- 从顶部导航栏中选择 新建。
- 选择 问题。
- 选择 原始数据 > 样本数据库 作为您的数据源。
- 然后选择
Orders
表。 - 选择 可视化,Metabase将显示来自
Orders
表的订单列表。 - 单击屏幕左下角的 设置按钮。Metabase将滑出一个包含 表选项 的侧边栏,并展示一个可供选择的列列表。
可见列是当前问题查询中的列,在这个例子中包括来自Orders
表的所有列。您可以添加和删除列,并更改列设置(这些设置取决于列的字段类型)。
除了可见列之外,您还会看到一个名为更多列的部分。这部分将包括来自其他两个表(Products
和People
)的列。(我们将在文章的后面部分解释为什么Reviews
表显得格外突出)。
Metabase已经“连接”了Orders
表与Products
和People
表,这使得您可以添加这些表的列。
例如,从这个设置侧边栏中向下滚动以找到Products
表,然后单击+
旁边的CATEGORY
列,将其添加到可见列中。您将在可见列中看到一个新列,Products → Category
,其前缀PRODUCT →
表明该列不是Orders
表的本地列。
通过单击ID列中的一个值并选择查看详情,您可以检查连接到该数据哪些表。例如,从Orders
表,您可以查看Product ID
列中的条目详情。Metabase告诉我们,产品“轻质羊毛电脑”(ID:146)连接到Orders
表和Reviews
表。
请注意,实际的产品ID值是146,而不是“轻质羊毛电脑”。Metabase允许管理员通过更改列值的显示方式。
当查看Orders
表时,外键PRODUCT_ID
会显示来自Products
表的TITLE
列的值。
我们将在下面深入探讨键,但首先让我们看看一个显式的连接。
示例显式连接
让我们尝试一个简单的连接。我们将通过点击+ 新建 > 问题 > 原始数据 > 样本数据库来创建一个新的问题。我们将选择Orders
表。在数据部分,点击连接图标以添加另一个表。
如果我们添加Products
表,Metabase将自动填写外键关系,因为它知道字段PRODUCT_ID
包含引用Products
表中ID
列(实体键)值的键。
对于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的
此表引用页面包含多个选项卡
- 详细信息
- 表中的字段
- 有关此表的疑问
- 检查此表
选择
Orders
表包含一个实体键(也称为主键),即ID
,以及两个外键:USER_ID
和PRODUCT_ID
- 外键
USER_ID
与People
表的实体键ID
相关联。 - 外键
PRODUCT_ID
与Products
表的实体键ID
相关联。
我们可以通过这些键将Orders
、People
和Products
表中的数据合并起来。连接只是告诉Metabase将一个表中的记录对齐,并使用每行中的外键值,通过查找具有匹配实体键值的对应行(或多行)来从另一个表中合并数据。
Metabase默认使用左连接。
多个连接
在了解表、键和连接的上下文后,让我们看看是否可以将Orders
表与Reviews
表连接起来。一般来说:如果起始表(左表)不包含引用我们要连接的表的表的外键,我们将如何进行连接?
如果我们尝试将Orders
表与Reviews
表连接起来,Metabase将不知道该怎么做。
Orders
表缺少与Reviews
表的关联外键,这就是为什么Metabase没有自动连接两个表的原因。
让我们转向数据浏览器,以找出Reviews
表包含哪些外键。
所以,这是我们的情况
Orders
表有指向Products
和People
表的外键。Reviews
表有一个指向Products
表的外键。
要将Orders
表与Reviews
表连接起来,我们需要通过Products
表进行连接。我们将使用查询构建器问题来指定连接。这是我们的问题
请注意,Metabase在指定键之前会以“先前结果”作为左表进行连接。一旦您告诉Metabase在Products.ID = Reviews.Product_ID
上连接先前结果,Metabase将在“连接数据”部分显示与评论表左连接的“产品”表。
如果您可视化结果,您将看到一个包含来自所有三个表(Orders
、Products
和Reviews
)所有列的表格。请注意,由于单个产品可以有多个评论,因此我们将看到相同产品和订单的多个行,每个评论一行。
具有多个条件的连接
现在让我们尝试在一个连接中添加多个条件。如果您想减少重复行或表达一些单条件连接无法表达的数据信息,这可能很有用。假设我们想看到所有订单产品是在我们添加该产品到库存的同一月份下订单的。
以上面相同的例子作为起点,点击第一个条件旁边的蓝色+按钮以在同一个连接中添加另一个条件。您在这里应该使用内连接,因为这只会返回两个表中匹配的值。
如下面所示,我们已经根据产品ID和创建日期在两个列上连接了Orders
和Products
表,因此现在我们可以看到所有在产品被添加到我们库存的同一月份下订单的订单。
请注意,虽然CREATED_AT
字段包含完整的日期和时间信息,但这些结果指示的是月份匹配,而不是确切的戳记。
列选择
除了连接我们的表之外,我们还可以选择我们问题结果中可见的列。在查询构建器中,您可以选择Metabase显示的列。
一旦您保存了您的问题,您还可以像上面那样从设置侧边栏中选择可见的列。
您会注意到Metabase很有帮助地使来自People
表的列可用,因此您现在可以使用完整的样本数据库。
在您的数据集中享受连接表,并记住:如果您卡住了,务必查阅数据浏览器,了解哪些表有您需要连接的外键。
相关阅读
下一部分:多级聚合
如何使用查询构建器提出包含多个部分的问题。