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