在日常活动中, 数据工程师和数据分析师需要改进数据摄取过程. 除了通常的单元测试之外,轻松快速地比较两个数据集(i.e. 表, 的观点, 查询, 等)用于不同的目的,如影响分析或非回归测试. 也, 快照表两个视图之间的差异标识对于专门分析或调试非常有用.
考虑到这一点和SQL实践者, 预先构建和可重用的脚本是有意义的, 这就是本文的目的.
解释了现成的SQL模板
让真人APP官网下载通过预期的查询进入问题的核心:


现在,让真人APP官网下载来解释一下:
第一个, 真人APP官网下载使用CTE -公共表表达式(WITH…ASstatements)来确定要比较的两个数据集. 因此,以下查询行可以保持不变.
然后, 真人APP官网下载构造了两个类似的查询,别名为dataset_1_only和dataset_2_only,以便保留只出现在数据集1中的行(与数据集2相比),反之亦然,这多亏了EXCEPT集操作符.
最后, 定义一个标志互补字段,以便从两个查询中识别不匹配行的来源. 然后通过UNION ALL集合操作符收集这些数据.
注意:显然,要使用上述查询,必须有两个具有可比字段的数据集
说明例子
理论讲够了,现在开始实践! 假设一家超市想要这样做 检索所有产品 有资格按周在单表中晋升 晋升条件.
作为初始声明,真人APP官网下载考虑以下库存产品:


根据第一周的推广情况:
水果、蔬菜和草药货架打九折
dataset_1是:


在第2周,晋升条件演变为:
水果和冰淇淋货架打九折
蔬菜货架八折优惠
草药货架上没有折扣
数据管道进化生成dataset_2:


但是,真人APP官网下载真的对结果有信心吗? 典型的问题是:
有缺少或多余的行吗?
在受影响的字段上实现的演进是否正确?
未受影响的领域是否有回归?
注意:尽管由于一个小数据集上的一个小示例,直观地回答上述问题似乎很容易, 在实际用例中,真人APP官网下载通常会遇到来自复杂查询(转换)的大量行和列, 连接, 聚合, 窗函数, ……)让这个问题具有完整的意义
让真人APP官网下载试着回答解释比较查询结果的3个问题:


观察:
没有一排水果货架上的产品: 细 为“水果九折优惠从第1周到第2周保持不变
Product_ID #50(草药货架)从dataset_2缺少(仅在dataset_1): 细 为“折扣草药在第2周被叫停
Product_ID #60(冰淇淋货架)从dataset_1中缺失(仅在dataset_2中): 细 为“折扣冰淇淋,在第二周介绍
关于Product_ID #30和#40(蔬菜货架)的行在reduced_price字段上分叉: 细 为“折扣的蔬菜从第一周的10%上升到第二周的20%
最后,一切看起来都很好:
有缺少或多余的行吗? No!
在受影响的字段上实现的演进是否正确? 是的!
未受影响的领域是否有回归? No!
提示和技巧
CTE中, 即使您可以在进化之前/之后复制粘贴您摄取的SQL查询, 这可能是个好主意 将结果存储在临时表中 为了简化比较, 如果多次运行缓存,可以提高查询性能并从中受益.
在现实世界中,两个数据集之间的分歧可能会很混乱. 然后, 排序结果 通过键(数据集的粒度)和标志可以极大地帮助解释和比较来自两个数据集的等效行.
为了便于调查和确定间隙的来源 可疑的数据集 常见的领域 可以删除(i.e. 注释在CTE中)来自比较:如果没有结果,这意味着所有的比较字段都是相等的. 然后,您可以只关注剩余的可疑字段,以便在下一个比较中逐步进行比较.
注意:可以使用LEFT JOIN策略执行等价的分析,但维护起来会困难得多(null & 字段比较管理)和效率较低的集合操作符比连接更强大.
Summary
因此,这种模板化查询使开发人员更容易在复杂的数据管道上快速验证更改. 它可以作为更传统的单元测试的补充, 甚至可以在比较任何两个结构相似的数据集时以更一般的方式考虑. 最后但并非最不重要的是,这个查询的逻辑甚至很容易记住!
谢谢你的阅读,我希望它是清晰的,我将很高兴听到你的反馈:)

对数据咨询|数据感兴趣 & 数字营销|数字商务 ?
阅读真人APP官网下载的每月通讯以获得可行的建议, 的见解, 业务案例, 来自世界各地的数据专家!