调试 SQL 查询逻辑
当你的查询返回看起来不正确的数据时,应该做什么。
合并数据可以非常快地变得复杂(这可能是你耐心地编写SQL而不是使用友好的查询构建器的原因)。此调试指南解释了当你的查询返回意外结果时你可以做什么。
调试步骤
- 获取你查询中使用的数据源的架构。
- 如果你使用的是数据库中的表,从数据参考获取架构。
- 如果你使用的是嵌套查询,如子查询、CTEs、保存的问题或模型,你需要单独运行每个嵌套查询并手动检查结果。
- 我不知道我是否在使用嵌套查询.
- 审查你的表或嵌套查询的外键。
- 有多个可能的外键吗?
- 外键已经被重命名或移动到另一个架构了吗?
- 如果你不确定,请咨询维护架构的人。
- 检查常见的SQL逻辑问题。
意外查询结果的原因
SQL逻辑描述了你的查询如何将来自不同表或数据源(包括临时表,如其他查询的结果)的数据结合起来。结合数据最常见的方式是连接和嵌套查询。
即使你的SQL逻辑曾经工作过,它也可能在以下情况下失败:
- 表或数据源已更改。
- 嵌套查询已更改(如果你是基于保存的问题或模型构建)。
- 你的嵌套查询没有按预期计算(如果你是从头编写的)。
- 你的数据包括边缘情况,例如空或
NULL
值。
通常,这些更改是由收集你的数据系统或管理你的数据库和BI工具的可爱的人引入的。
团队预测此类更改的连锁反应非常困难。修复SQL逻辑不仅关于应对变化,而且更新你的方法以更好地防范未来的更新。
如果你收到一个提及SQL子句、表和列名称的红错误消息,你很可能有一个SQL语法问题。请访问调试SQL语法。
常见的SQL逻辑问题
聚合结果(计数、求和等)是错误的
- 如果你的聚合是
- 检查你的源表或查询中的过滤器。
- 你在聚合中如何处理空或
NULL
行? - 你如何处理无效、取消或过期的记录?向你的Metabase管理员或数据团队询问你可能不知道的业务逻辑。
- 你在聚合中如何处理空或
- 如果你使用
COUNT_DISTINCT
,检查它是否与其他聚合函数交互。- 例如,在
COUNT_DISTINCT
之上应用SUM
可能会重复计数唯一值。
- 例如,在
- 如果你处理时间序列数据,检查你的时区。
- 如果你的数据按计划更新,请向你的Metabase管理员询问你的表是否是最新的。
说明
聚合通常是最先检测到查询结果异常原因的地方之一,这些原因可能是由常见查询结果异常原因中的一些原因造成的。上述步骤将帮助您捕捉到可能导致结果偏差的数据边缘情况。如果您发现了很多边缘情况,并且预计需要反复处理相同的案例,您可能希望将这些逻辑打包到一个模型中,以便可以轻松重用。
有时,您可能只需要一双新的眼睛。如果您无法使用上述步骤找到根本原因,请请同事帮助您检查您的数学计算!
进一步阅读
如何识别嵌套查询
如果您的SQL包含
-
多个
SELECT
语句,您正在使用子查询。 -
一个
WITH
子句,您正在使用CTEs(公共表表达式)。 -
在您的
FROM
或WITH
子句中看起来像{{ variable }}
的符号,您有一个SQL变量,它引用了一个已保存的问题或模型。
如何获取嵌套查询的模式
- 从您的嵌套查询中获取数据样本。
- 对于子查询或CTEs,分别运行每个
SELECT
块,并使用LIMIT
子句。 - 对于已保存的问题或模型,从变量面板或通过将ID号粘贴到搜索栏中转到底层的Metabase问题。使用查询构建器添加行限制,或在SQL编辑器中添加
LIMIT
子句。
- 对于子查询或CTEs,分别运行每个
- 比较您的样本之间的列名和值以检查外键。例如
- 在Metabase样本数据库中,
Products
表有一个ID
列,而Orders
表有一个Product ID
列。 ID
和Product ID
都包含整数值,并且许多这些值出现在两个列中。
- 在Metabase样本数据库中,
- 比较您的样本之间的行以检查表关系。例如
Products
表在ID
列中具有唯一值。Orders
表有多个具有相同Product ID
的行。- 从
Products
到Orders
的表关系是一对一(假设外键关系有效)。
- 如果您正在使用模型,您可以通过悬停在列名上查找显式定义的元数据。
- 如果您正在基于他人的工作构建,请向查询、已保存的问题或模型的原始创建者咨询。
说明
模式描述了表中的列、这些列的数据类型以及不同表之间列的关系。这种元数据通常由管理您的数据的人员明确定义为存储在您的数据库中的表。
由于嵌套查询的结果仅临时存储,因此关于结果的数据元数据没有定义或存储在任何地方。上述步骤将帮助您手动检查查询结果。
一旦您有了嵌套查询的模式,您就可以按照调试步骤进行。
进一步阅读
您遇到不同的问题吗?
您仍然卡住了吗?
搜索或询问Metabase社区。
下一步:调试SQL查询结果中的重复数据
当您的查询返回具有重复行或列的数据时,您应该做什么。