详细内容或原文请订阅后点击阅览
像软件工程师一样测试 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 排序;
