为什么我的次级合并结果查询中会出现 null?

合并结果是一项便捷功能,可让您快速合并来自不同探索的数据,而无需在 LookML 中进行开发。合并后的结果会在主查询和次级查询之间有效执行左联接,这意味着字段名称、匹配值和最终结果表取决于次级查询中的数据与主查询的匹配方式。

这可能会导致您在探索之间执行合并时出现意外结果。“合并结果”文档介绍了其中的一些条件,例如:

不过,如果您希望次级查询中的值与主查询中的值匹配,但最终结果显示 null 值,该怎么办?

本页介绍了如何排查此意外结果。

用例示例

以下示例用例基于包含用户和订单信息的电子商务示例数据集。在此示例中,您需要将一个查询(按城市统计的用户数,用户数用户所在的城市分组)与一个次级查询(按城市和用户所在的州统计的订单数,订单数用户所在的城市用户所在的州分组)合并:

主要查询

主要查询是按用户所在的城市用户数进行分组:

浏览显示主查询结果的合并结果数据表。

次要查询

次级查询是按用户所在的城市用户所在的州订单数量进行分组:

探索显示次要查询结果的合并结果数据表。

合并规则设置为按这两个查询共有的字段“用户所在的城市”合并这两个查询。由于您熟悉之前链接的文档中介绍的数据集和预期的合并结果行为,因此您知道,在每行中,每个城市都应与一个州和用户数相匹配。您希望合并后的结果与所有值匹配,并且不显示 null 值。

不过,结果中存在 null。超过一半的城市与州或订单数量不匹配:

合并后的结果数据表,其中显示了次级查询字段的 null 值。

解决方案

不用紧张。如果您确定数据中存在匹配值(请尝试运行单独的查询来确认这一点),则可以通过以下几种方法来解决此问题:

  • 以相同的方式对每个来源查询进行排序。
  • 提高来源查询行数限制。

以相同的方式对每个来源查询进行排序

由于合并的结果基于“探索”,而“探索”默认限制为 500 行,因此有时您要合并的查询结果不会包含在最终结果中。

要解决此问题,您可以修改排序各个来源查询,以便它们更好地匹配。 

在示例用例中,主要查询按用户所在的城市从高到低排序。辅助查询则不受此限制。为了更好地匹配这两个查询的结果,您可以像对主要查询一样对次级查询进行排序,在本例中,按用户所在的城市从高到低排序。

将次级查询按与主查询类似的方式排序,可在最终合并时更准确地匹配结果:

显示主查询字段和次要查询字段的非 null 值的合并结果数据表。

提高来源查询行数上限

与前面介绍的第一种解决方案类似,意外 null 值也可能是由来源查询中设置的行数限制导致的。具体而言,在本例中,辅助查询(受默认 500 行的限制)的行数不足以匹配主查询生成的所有行,导致最终合并中显示 null 结果。

如需增加次级查询中的行数以与主查询相匹配,您可以增加次级查询行数上限。这样一来,与主查询匹配的行就可能更多,而次级查询列中的 null 值就可能更少:

显示主查询字段和次要查询字段的非 null 值的合并结果数据表。

摘要

如果遇到意外的合并结果,您可以按照以下步骤进行问题排查:

  1. 从“探索”的齿轮菜单中选择清除缓存并刷新选项,以确保查询会提取最新的结果。
  2. 确认显示 null 值的来源查询之间存在匹配的值,如“合并后的结果”文档的如果某个查询没有匹配的数据值,该怎么办?部分所述。
  3. 对来源查询进行排序,以便更好地匹配彼此。
  4. 将来源查询的行数上限提高到默认上限以上,以显示更多可匹配和合并的行。
  5. 如果这里讨论的所有解决方案都无法解决此行为,请尽可能将联接逻辑硬编码到 LookML 中,以获得更精确的结果。