像软件工程师一样测试 SQL:单元测试、CI/CD 和数据质量自动化

如何将面试式 SQL 查询转变为生产就绪、可测试、版本控制的工作流程。

来源:KDnuggets

简介

每个人都专注于编写“有效”的 SQL,但很少有人测试它明天是否继续有效。单个新行、更改的假设或重构都可能会默默地破坏查询。本文将介绍完整的工作流程,展示如何像对待软件一样对待 SQL:版本化、测试和自动化。我们将使用真实的亚马逊面试问题来识别每日支出最高的客户。然后,我们将 SQL 转换为可测试的组件,定义预期输出,并通过持续集成和持续部署 (CI/CD) 进行自动化测试。

第 1 步:解决面试式 SQL 问题

理解问题

在亚马逊的这个面试问题中,您需要找到特定日期范围内每日总订单成本最高的客户。

了解数据集

该项目中有两个数据表:客户和订单。

客户表:

这是数据集的预览:

订单表:

这个问题非常适合说明如何像软件一样对待 SQL:查询必须正确、稳定并且能够抵抗回归。

编写 SQL 解决方案

逻辑分为三个部分:

  • 汇总每个客户每天的总支出
  • 按每个日期的总支出对客户进行排名
  • 仅返回每日最高消费者
  • 这是最终的 PostgreSQL 解决方案:

    WITH customer_daily_totals AS (选择o.cust_id,o.订单日期,SUM(o.total_order_cost) AS 每日总成本FROM 订单 oWHERE o.order_date 介于“2019-02-01”和“2019-05-01”之间按 o.cust_id、o.order_date 分组),每日排名总计 AS (选择客户 ID,订单日期,每日总费用,排名()超过(按订单日期分区ORDER BY 每日总成本 DESC) AS rnk来自 customer_daily_totals)选择c.名字,rdt.订单日期,rdt.total_daily_cost AS max_cost来自 Ranked_daily_totals rdt加入客户 c ON rdt.cust_id = c.id其中 rdt.rnk = 1按 rdt.order_date 排序;