如果查询包含多个来源,请在 Builder 中创建关系,以定义如何根据共享值(例如实体 ID、账号或部门)合并它们的记录。
注意 :在 SQL编辑器中, 可以使用 JOIN 子句来
定义查询数据源之间的关系 。 概述
例如,假设您的查询包含一个订单事实表和一个客户维度表作为数据源。在 “关系 ”选项卡中,您可以定义如何关联订单:
| 订单号 | 客户ID | 订单日期 |
|---|---|---|
| 111222 | 001 | 01/02/2021 |
| 121212 | 010 | 02/01/2021 |
| 212121 | 100 | 01/12/2021 |
对客户而言:
| 客户ID | 客户名称 | 地区 |
|---|---|---|
| 001 | AAA干洗店 | 北 |
| 010 | 韦恩科技 | 东方 |
| 011 | Señor Taqueria | 西方 |
提示:要在维度表中标识
具有唯一值的列(例如 CustomerID ),请将其标记 为 键 列。由于两个表都包含客户 ID,您可以基于它们各自的 CustomerID 列创建关系,并选择如何合并(或 join)它们的记录。
左 连接关系 返回第一个源(左侧)中的 所有记录,以及在另一个 源中也匹配的 任何记录。
提示:为避免 左连接中出现重复值,请确保关系中 右侧 的第二个源列包含唯一值,例如维度表的键 列
。例如,在我们的 Orders 表和 Customers 表之间的关系中, 左连接 返回所有订单,并提供有关 Customers 表中客户 ID 匹配的订单的更多详细信息。客户表中客户 ID 为 的订单未匹配 ,附加客户数据包含空值。
| 订单号 | 客户ID | 客户名称 | 订单日期 | 地区 |
|---|---|---|---|---|
| 111222 | 001 | AAA干洗店 | 01/02/2021 | 北 |
| 121212 | 010 | 韦恩科技 | 02/01/2021 | 东方 |
| 212121 | 100 | -------------------- | 01/12/2021 | ------- |
右 连接关系 返回第二个源(右侧 )的 所有记录,以及在另一个 源中也匹配的任何记录。
提示:
为避免 右连接中出现重复值,请确保关系中 左侧 的第一个源列(例如维度表的键列 )包含唯一值。对于我们的 Orders 和 Customers 表, 右连接 返回所有客户,并为在 Orders 表中 ID 匹配的客户提供更多详细信息。订单表中 ID 为 的客户未与 匹配,其附加订单数据包含空值。
| 订单号 | 客户ID | 客户名称 | 订单日期 | 地区 |
|---|---|---|---|---|
| 111222 | 001 | AAA干洗店 | 01/02/2021 | 北 |
| 121212 | 010 | 韦恩科技 | 02/01/2021 | 东方 |
| -------- | 011 | Señor Taqueria | ------------- | 西方 |
内部 连接关系仅返回同时出现在 两个 源中的记录。
在我们的订单表和客户表的关系中, 内连接 仅返回在两个来源中 ID 都匹配的客户所下的订单。
| 订单号 | 客户ID | 客户名称 | 订单日期 | 地区 |
|---|---|---|---|---|
| 111222 | 001 | AAA干洗店 | 01/02/2021 | 北 |
| 121212 | 010 | 韦恩科技 | 02/01/2021 | 东方 |
完全 连接关系返回来自 任一源 的所有记录。
以我们的 Orders 和 Customers 表为例, Full join 返回 所有 个订单和客户。客户 ID 仅在一个数据源中匹配的记录,对于缺失数据将包含空值。
| 订单号 | 客户ID | 客户名称 | 订单日期 | 地区 |
|---|---|---|---|---|
| 111222 | 001 | AAA干洗店 | 01/02/2021 | 北 |
| 121212 | 010 | 韦恩科技 | 02/01/2021 | 东方 |
| -------- | 011 | Señor Taqueria | ------------- | 西方 |
| 212121 | 100 | -------------------- | 01/12/2021 | ------- |
在 “关系 ”选项卡上,您可以定义查询的多个来源之间的关系。要定义这种关系,您需要匹配数据源之间共享的数据,并选择如何在查询结果中连接它们的记录。
注: 查询关系是累积的;它们彼此相互依存。一次连接中的数据源决定了可以与其他数据源连接的列。
步骤 1. 指定要加入的源
要定义查询中某个源与其他源的关系,请将其从 源 拖到 关系 选项卡。
- 要定义查询源之间的第一个关系,请将两个源从 Sources 拖到 Join 1。
- 要定义源与先前连接的源之间的关系,请单击 添加另一个连接,然后将源从 源 拖到新连接。
注意: 如果一个查询有多个连接,请按它们应该发生的顺序排列它们,因为每个连接都依赖于前一个连接的来源。要重新定位连接,请从其菜单中选择 上移 或 下移 。要删除连接(例如,如果查询不再包含其源),请从其菜单中选择 “删除 ”
。
步骤二:说明各来源之间的关系
要定义数据源之间的关系,您可以根据以下方式映射共享值:
- 列及其对应数据
- 计算字段,用于根据需要调整源的值,使其与另一个源精确匹配。
提示: 只能连接相同数据类型的列。要匹配不同数据类型的数据,例如,如果一个数据源中的帐户 ID 是整数,而另一个
数据源中的帐户 ID 是文本字符串, 请在 “字段属性 ”面板中编辑列的 类型。在连接中,从每个源中选择相应的列,并根据它们的值选择如何匹配记录。
| 运算子 | 描述 |
|---|---|
| 等于(=) | 匹配两个来源中具有相同值的记录 |
| 不等于(!=) | 将两个数据源中具有不同值的记录进行匹配,例如将帐户 ID 映射到帐户名称。 |
| 大于(>) | 当左侧数据源的数值或日期/时间值大于或晚于右侧数据源的值时,匹配记录。 |
| 大于或等于 (>=) | 当左侧数据源的数值或日期/时间值与右侧数据源的值相同、更大或更晚时,匹配记录。 |
| 小于(<) | 当左侧数据源的数值或日期/时间值小于或早于右侧数据源的值时,匹配记录。 |
| 小于或等于 (<=) | 当左侧数据源的数值或日期/时间值与右侧数据源的值相同、小于或早于右侧数据源的值时,匹配记录。 |
要准确映射不同数据源之间的值,可以对数据源列应用计算。例如,要映射到“账户映射”维度表中的账号,您可能需要:
- 调整单个源列中的值,例如从试算表事实表中的帐户编号提取前六位数字
—— SS_LEFT(tb.account, 6) - 使用来自多个源列的值,例如合并(或连接) 先前连接的试算表事实表和实体映射维度表中的帐户编号和 ID
—— CONCAT(tb.account,entity.id) - 在列值中定义一个通用模式,例如在试算表事实表中将账号与前缀或后缀区分开来——
tb.account LIKE __1005%
注意: 要定义模式,可以使用通配符来表示要忽略的字符——下划线 (
_) 表示单个字符,百分号 (%) 表示零个或多个字符。
将计算应用于数据源的值:
- 在连接中,选择源下的 计算字段 ,并输入要调整的值。
- 在 字段属性 面板中,将要包含在计算中的列从 源 拖到 包含的列。
注意:为确保 SQL 语句正确,请仅包含所选数据源中的列
。 - 在 计算下,编写要应用于列值的结构化查询语言 (SQL) 操作。
- 要引用计算中的列,请单击该列,或从其菜单下的 “包含列”中选择 “包含在计算中 ” ,或在方括号中输入其编号,例如
“ {1}+{2}” 。 - 要快速向计算中添加 SQL运算符或 函数,请从 计算 菜单中选择它。
- 要引用计算中的列,请单击该列,或从其菜单下的 “包含列”中选择 “包含在计算中 ” ,或在方括号中输入其编号,例如
- 在连接操作中,选择如何根据连接列的值来匹配记录:
运算子 描述 等于(=) 匹配两个来源中具有相同值的记录 不等于(!=) 将两个数据源中具有不同值的记录进行匹配,例如将帐户 ID 映射到帐户名称。 赞 如果计算字段定义了一个包含通配符的模式,则匹配值与该模式匹配的记录。 不像 如果计算字段定义了一个包含通配符的模式,则匹配值与该模式 不匹配的记录 。 大于(>) 当左侧数据源的数值或日期/时间值大于或晚于右侧数据源的值时,匹配记录。 大于或等于 (>=) 当左侧数据源的数值或日期/时间值与右侧数据源的值相同、更大或更晚时,匹配记录。 小于(<) 当左侧数据源的数值或日期/时间值小于或早于右侧数据源的值时,匹配记录。 小于或等于 (<=) 当左侧数据源的数值或日期/时间值与右侧数据源的值相同、小于或早于右侧数据源的值时,匹配记录。
步骤 3. 定义复合连接
单个连接可以映射其源之间的多个值。要在连接中映射其他值对:
- 点击 添加字段。
- 指定要在数据源之间映射的其他列或计算字段。
- 选择是否连接 多个 映射值(和)或仅连接 特定 值(或)。
如果一个源中的多个值分别对应于另一个源中的不同值,则选择 和 以根据多个映射值匹配记录。
例如,如果试算表事实表中的列映射到账户映射维度表中的 账号 和 实体 键列的组合,则单击 和 并将表的对应列连接起来。
注: 在 SQL 编辑器中,关系显示为 JOIN ON (TB.entity = AccountMap.entity) AND (TB.account = AccountMap.account)
如果一个源的值可以根据数据与另一个源中的多个值相对应,请选择 或 以根据特定的映射值匹配记录。
例如,如果“账户映射”维度表中的 账户 键列映射到“试算表”事实表中的 账户 或 子账户 列,则单击 或 并将键列连接到事实表的这两个列。
注: 在 SQL 编辑器中,关系显示为 JOIN ON (AccountMap.account = TB.account) OR (AccountMap.account = TB.subaccount)
注: 如果您的复合连接同时包含 AND 和 OR 运算符,它将匹配满足由 AND分隔的所有条件的记录,以及满足由 OR分隔的所有条件的记录。
步骤 4. 选择如何合并源记录
在连接中,选择如何在查询结果中合并源记录:
| 加入 | 返回 |
|---|---|
| 左连接 |
连接中左侧源的所有记录以及右侧源中任何匹配的记录 |
| 右连接 |
连接中来自右侧源的所有记录以及左侧源中任何匹配的记录 |
| 内连接 |
只有两个来源中都匹配的记录 |
| 完全加入 |
来自任一来源的所有记录 |
定义查询的所有来源之间的关系后,单击 保存 。
注: 保存查询时,查询会自动删除所有未定义关系的数据源。
<!--Performing a UNION
When you add a relationship between two sources, you create a
JOIN clause in the query's SQL, which combines the data
into new columns. To instead combine your data into new rows,
you can use a UNION operator in the SQL Editor.
However, a union may create more records or rows
than Spreadsheets or another consumer of the results can support.
As an alternative,
create a table
and append the sources' data as datasets, which you can then slice-and-dice
and analyze in a query.