Metabase 中的联接
如何在 Metabase 中使用 Notebook 编辑器在简单和自定义问题中联接表。
在数据分析中,联接是司空见惯的操作,而 Metabase 致力于让您尽可能轻松地获取问题的答案——即使这需要一些更复杂的策略。本文将介绍如何在 Metabase 中使用查询构建器联接表,并提供有关关系数据库、表和键的一些背景知识,以便您更好地理解联接的工作原理。
自动联接
联接允许您合并来自多个表的数据。在可能的情况下,Metabase 会为您建立这些连接,使人们可以轻松地处理跨多个表的数据。您必须在数据模型中定义外键关系,Metabase 才能检测到这些关系并在数据模型中连接这些表。如果未配置这些外键,管理员始终可以使用“数据模型”部分来指定这些关系。
我们将在下面深入探讨键,但现在,让我们看看隐式联接的实际应用。我们将使用 Metabase 随附的示例数据库作为数据,以便您可以亲自尝试。
- 从顶部导航栏中,选择“+ 新建”。
- 选择“问题”。
- 选择“原始数据”>“示例数据库”作为您的数据源。
- 然后选择
Orders
表。 - 选择“可视化”,Metabase 将显示
Orders
表中的订单列表。 - 单击屏幕左下角的“设置”按钮。Metabase 将滑出“表选项”侧边栏,并向您显示可供选择的列列表。
“可见列”是当前问题查询中的列,在本例中包括 Orders
表中的所有列。您可以添加和删除列,并更改列设置(具体取决于列的字段类型)。
除了“可见列”,您还会看到一个名为“更多列”的部分。此部分将包含来自另外两个表的列:Products
和 People
。(我们将在文章后面解释为什么 Reviews
表明显缺失)。
Metabase 已经将 Orders
表“联接”到 Products
表和 People
表,这允许您从这些表中添加列。
例如,在此“设置侧边栏”中,向下滚动找到 Products
表,然后单击 CATEGORY
列旁边的“+”以将其添加到“可见列”中。您将在可见列中看到一个新列 Products → Category
,其中 PRODUCT →
前缀表示该列并非 Orders
表的固有列。
通过单击 ID 列中的值并选择“查看详细信息”,您可以检查哪些表连接到该数据。例如,从 Orders
表中,您可以查看“产品 ID”列中条目的详细信息。Metabase 告诉我们,产品“Lightweight Wool Computer”(ID:146)连接到 Orders
表和 Reviews
表。
请注意,实际的产品 ID 值为 146,而不是“Lightweight Wool Computer”。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 的“数据浏览器”来查看示例数据库中的一些键。从 Metabase 顶部的导航栏中,转到“浏览数据”,然后单击“示例数据库”。您将看到每个表的卡片。将鼠标悬停在卡片上以查看其他选项,然后单击“了解此表”旁边出现的书本图标。
此表参考页面包含多个选项卡
- 详细信息
- 此表中的字段
- 关于此表的问题
- X 光分析此表
选择“此表中的字段”选项卡以查看表中每个字段的字段名称、字段类型和数据类型。
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 将在“联接数据”部分显示 Products
表左联接到 Reviews
表。
如果您可视化结果,您将看到一个包含所有三个表(Orders
、Products
和 Reviews
)中所有列的表。请注意,由于单个产品可以有多个评论,我们将看到同一产品和订单的多行,每条评论一行。
多条件联接
现在让我们尝试向联接添加多个条件。如果您想减少重复行或表达单个条件联接无法表达的数据信息,这可能会很有用。假设我们想查看所有在产品添加到库存的同一个月下的订单。
以上述示例作为起点,单击第一个条件旁边的蓝色“+”按钮,在同一个联接中添加另一个条件。您将需要在此处使用内联接,因为它只会返回两个表中匹配的值。
如下所示,我们已将 Orders
表和 Products
表通过两个列(产品 ID 和创建日期)联接起来,因此现在我们可以看到所有在产品添加到库存的同一个月下的订单。
请注意,虽然 CREATED_AT
字段包含完整的日期和时间信息,但这些结果表示月份匹配,而不是确切的时间戳。
列选择
除了联接表之外,我们还可以选择问题结果中哪些列可见。在“查询构建器”中,您可以选择 Metabase 显示的列。
保存问题后,您还可以从“设置”侧边栏中选择可见列,如上所述。
您会注意到 Metabase 还会方便地提供 People
表中的列供您添加,因此您现在可以随意使用完整的示例数据库。
尽情享受在您自己的数据集中联接表的乐趣吧,请记住:如果您遇到困难,请务必查阅数据浏览器,以了解哪些表具有您需要用于联接它们的外键。
相关阅读
下一篇:合并来自不同数据库的数据
如何在 Metabase 中联接来自不同数据库的表。