调试 SQL 查询逻辑

查询返回的数据看起来不正确时该怎么办。

组合数据会非常迅速地变得复杂(这可能就是您耐心编写 SQL 而不是使用友好的 查询生成器 的原因)。本调试指南将解释当您的查询返回意外结果时可以采取的措施。

调试步骤

  1. 获取查询中使用的数据源的架构。
  2. 检查您的表或嵌套查询的外键。
    • 是否有多于一个可能的外键?
    • 外键是否已被重命名或移至其他架构?
    • 如果不确定,请咨询维护该架构的人员。
  3. 检查 常见的 SQL 逻辑问题

查询结果意外的常见原因

SQL 逻辑描述了您的查询如何将数据从不同表或数据源(包括临时表,例如其他查询的结果)组合在一起。最常见的数据组合方式是 join 和 嵌套查询

即使您的 SQL 逻辑*曾经*有效,当以下情况发生时也可能中断:

  • 表或数据源已更改。
  • 嵌套查询已更改(如果您正在构建在 已保存的查询或模型 之上)。
  • 您的嵌套查询未按预期计算(如果您是自己编写的)。
  • 您的数据包含边缘情况,例如空值或 NULL 值。

大多数情况下,这些更改由收集数据的系统,或管理您的数据库和 BI 工具的可爱的人员在后台引入。

团队很难预测此类更改的涟漪效应。修复 SQL 逻辑不仅是为了应对变化,更是为了更新您的方法,以便更好地防范未来的更新。

如果您看到一条红色的错误消息,其中提到了 SQL 子句或表名和列名,那么您很可能遇到 SQL 语法问题。请改用 调试 SQL 语法

常见的 SQL 逻辑问题

聚合结果(计数、总和等)不正确

  1. 如果您的聚合结果
    • 太高,请检查您的源表或查询是否包含 重复行
    • 太低,请检查您的源表或查询是否包含 丢失的行
  2. 检查您的源表或查询中的过滤器。
    • 您如何处理聚合中的空值或 NULL 行?
    • 您如何处理无效、已取消或已过期的记录?询问您的 Metabase 管理员或数据团队关于您可能不知道的业务逻辑。
  3. 如果您正在使用 COUNT_DISTINCT,请检查它是否与其他聚合函数交互。
    • 例如,对 COUNT_DISTINCT 应用 SUM 可能会重复计算唯一值。
  4. 如果您正在处理时间序列数据,请 检查您的时区
  5. 如果您的数据按计划更新,请询问您的 Metabase 管理员 您的表是否是最新的

解释

聚合通常是您检测到由 意外查询结果的常见原因 之一引起的问题的第一个地方。上述步骤将帮助您捕获可能导致结果失真的任何数据边缘情况。如果您发现大量边缘情况,并且您预计需要一遍又一遍地处理相同的情况,您可能希望将所有这些逻辑打包到一个 模型 中,以便可以轻松重用。

有时,您可能只需要一双新鲜的眼睛。如果您无法使用上述步骤找到根本原因,请让同事帮助您检查您的计算!

延伸阅读

如何识别嵌套查询

如果您的 SQL 包含

  • 多个 SELECT 语句,您正在使用子查询。

  • WITH 子句,您正在使用 CTE(公共表表达式)。

  • 在您的 FROMWITH 子句中看起来像 {{ 变量 }} 的表示法,您有一个 SQL 变量,它引用了一个 已保存的查询或模型

如何获取嵌套查询的架构

  1. 从您的嵌套查询中获取数据样本。
    • 对于子查询CTE,请单独运行每个 SELECT并使用 LIMIT 子句。
    • 对于已保存的查询或模型,通过变量面板或将 ID 号粘贴到搜索栏中,导航到基础 Metabase 查询。使用查询生成器添加行限制,或在 SQL 编辑器中添加 LIMIT 子句。
  2. 比较样本之间的列名和值以检查外键。例如
    • Metabase 示例数据库 中,Products 表有一个 ID 列,而 Orders 表有一个 Product ID 列。
    • IDProduct ID 都包含整数值,其中许多值在这两列中都显示出来。
  3. 比较样本之间的行以检查 表关系。例如
    • Products 表的 ID 列中包含唯一值。
    • Orders 表中,多行具有相同的 Product ID
    • ProductsOrders 的表关系是一对多(假设外键关系有效)。
  4. 如果您使用的是 模型,则可以通过将鼠标悬停在列名上来查找明确定义的元数据。
  5. 如果您正在构建别人的工作成果,请询问查询、已保存的查询或模型的原始创建者。

解释

架构描述了表中的列、这些列的数据类型以及不同表之间列之间的关系。这些元数据通常由管理您数据的人员为存储在数据库中的表明确定义。

由于嵌套查询的结果仅临时存储,因此关于结果的元数据并未在任何地方定义或存储。上述步骤将帮助您手动检查查询结果。

获取嵌套查询的架构后,您可以按照 调试步骤 进行操作。

延伸阅读

您有其他问题吗?

您还卡住了吗?

搜索或咨询 Metabase 社区

这有帮助吗?

感谢您的反馈!
订阅新闻通讯
Metabase 的更新和新闻
© . This site is unofficial and not affiliated with Metabase, Inc.