调试 SQL 查询逻辑
当您的查询返回看起来不正确的数据时该怎么做。
使用 Metabase 学习 SQL
数据组合可能会很快变得复杂(这可能就是您耐心编写 SQL 而不是使用友好的查询构建器的原因)。本调试指南解释了当您的查询返回意外结果时可以采取的措施。
调试步骤
- 获取查询中使用的数据源的模式。
- 如果您正在使用数据库中的表,请从数据参考中获取模式。
- 如果您正在使用嵌套查询(例如子查询、CTE、保存的问题或模型),您需要单独运行每个嵌套查询并手动检查结果。
- 我不知道我是否在使用嵌套查询.
- 检查您的表或嵌套查询的外键。
- 是否有多个可能的外键?
- 外键是否已重命名或移动到其他模式?
- 如果您不确定,请咨询模式维护人员。
- 检查常见的 SQL 逻辑问题。
查询结果异常的常见原因
SQL 逻辑描述了您的查询如何组合来自不同表或数据源的数据(包括临时表,例如其他查询的结果)。最常见的数据组合方式是连接和嵌套查询。
即使您的 SQL 逻辑曾经有效,它也可能在以下情况下中断:
- 表或数据源已更改。
- 嵌套查询已更改(如果您是在保存的问题或模型之上构建的)。
- 您的嵌套查询未按预期计算(如果您是从头开始编写的)。
- 您的数据包含边缘情况,例如空值或
NULL
值。
大多数情况下,这些更改是由收集您数据的系统,或管理您的数据库和 BI 工具的人员在上游引入的。
团队很难预料到此类更改产生的连锁效应。修复 SQL 逻辑不仅是为了响应更改,更是为了更新您的方法,以更好地防范未来的更新。
如果您收到红色错误消息,其中提及 SQL 子句或表和列名,则您很可能存在 SQL 语法问题。请转到调试 SQL 语法。
常见的 SQL 逻辑问题
聚合结果(计数、求和等)不正确
- 如果您的聚合
- 检查您的源表或查询是否有筛选器。
- 您如何在聚合中处理空行或
NULL
行? - 您如何处理无效、已取消或已过期记录?请咨询您的 Metabase 管理员或数据团队,了解您可能不知道的业务逻辑。
- 您如何在聚合中处理空行或
- 如果您正在使用
COUNT_DISTINCT
,请检查它是否与其他聚合函数交互。- 例如,在
COUNT_DISTINCT
之上应用SUM
可能会重复计算唯一值。
- 例如,在
- 如果您正在处理时间序列数据,请检查您的时区。
- 如果您的数据按计划更新,请询问您的 Metabase 管理员您的表是否最新。
解释
聚合通常是您发现由查询结果异常的常见原因引起问题的第一处。上述步骤将帮助您发现可能扭曲结果的任何数据边缘情况。如果您发现大量边缘情况,并且预计会反复处理相同的情况,您可能希望将所有这些逻辑捆绑到一个模型中,以便轻松重用。
有时,您可能只是需要一双新的眼睛。如果您无法使用上述步骤找到根本原因,请让队友帮助您检查计算!
延伸阅读
如何识别嵌套查询
如果您的 SQL 包含
-
多个
SELECT
语句,则您正在使用子查询。 -
WITH
子句,则您正在使用 CTE(公共表表达式)。
如何获取嵌套查询的模式
- 获取嵌套查询的数据样本。
- 对于子查询或CTE,单独运行每个
SELECT
块并使用LIMIT
子句。 - 对于保存的问题或模型,请从变量面板转到底层 Metabase 问题,或通过将 ID 号粘贴到搜索栏中。使用查询构建器添加行限制,或在 SQL 编辑器中添加
LIMIT
子句。
- 对于子查询或CTE,单独运行每个
- 比较样本中的列名和值以检查外键。例如
- 在Metabase 示例数据库中,
Products
表有一个ID
列,而Orders
表有一个Product ID
列。 ID
和Product ID
都包含整数值,并且许多这些值都出现在这两个列中。
- 在Metabase 示例数据库中,
- 比较样本中的行以检查表关系。例如
Products
表在ID
列中具有唯一值。Orders
表包含多行具有相同Product ID
的数据。- 从
Products
到Orders
的表关系是一对多(假设外键关系有效)。
- 如果您正在使用模型,您可以通过将鼠标悬停在列名上来查找明确定义的元数据。
- 如果您正在基于他人的工作进行构建,请咨询该查询、已保存问题或模型的原始创建者。
解释
模式描述了表中的列、这些列的数据类型以及不同表之间列的关系。此元数据通常由管理您数据的人员明确定义在数据库中存储的表。
由于嵌套查询的结果仅临时存储,因此有关结果的元数据未定义或存储在任何地方。上述步骤将帮助您手动检查查询结果。
获取嵌套查询的模式后,您可以按照调试步骤进行操作。
延伸阅读
您有其他问题吗?
您还卡住了吗?
搜索或询问 Metabase 社区。
下一篇:调试 SQL 查询结果中的重复数据
当您的查询返回包含重复行或列的数据时该怎么做。