调试 SQL 查询逻辑

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

使用 Metabase 学习 SQL

免费下载 Metabase,或注册 Metabase 云版免费试用

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

调试步骤

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

查询结果异常的常见原因

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

即使您的 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子句中类似{{ variable }}的表示法,则您有一个引用已保存问题或模型SQL 变量

如何获取嵌套查询的模式

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

解释

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

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

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

延伸阅读

您有其他问题吗?

您还卡住了吗?

搜索或询问 Metabase 社区

下一篇:调试 SQL 查询结果中的重复数据

当您的查询返回包含重复行或列的数据时该怎么做。

下一篇文章
© . All rights reserved.