如何查找内容表 SQL 中的差异

Posted

技术标签:

【中文标题】如何查找内容表 SQL 中的差异【英文标题】:How to find differences in a content table SQL 【发布时间】:2018-12-14 09:30:13 【问题描述】:

我想根据同一张表中的不同数据集查找彼此不同的记录,这些数据集在不同的日期加载。 因此,如果一个或多个属性(除了键)与 2018 年 1 月 1 日加载的数据集 x 和 2018 年 12 月 31 日加载的数据集 y 不同。 我如何在 SQL 中实现这一点?

应该进行比较的键是 ZIP_CODE + House_ID

你好,

【问题讨论】:

我们在谈论哪些 dbms? 请提供样本数据和期望的结果。 【参考方案1】:

您可以通过 LAG 获取以前的邮政编码

SELECT ZipCode, HouseId,   
 LAG(ZipCode, 1,0) OVER (ORDER BY LoadDate) AS ZipCodeMinus1,
 LAG(HouseId, 1,0) OVER (ORDER BY LoadDate) AS HouseIdMinus11   
FROM Addresses;

【讨论】:

谢谢!但是,如果 x 列在 2018 年 1 月 1 日的值为 10,而在 2018 年 12 月 31 日的值为 15,该怎么办?如何根据 ZIP_CODE + House_ID 找到该记录? 编辑了我的答案。您可以通过 SQL 上的子查询来进行计算【参考方案2】:

比较集合的简单方法是

select ... a
EXCEPT
select ... b

但你需要另一个

select ... b
EXCEPT
select ... a

这并不能告诉您哪些列不同。

或者你使用full outer join:

select
   coalesce(a.ZIP_CODE, b.ZIP_CODE)
  ,coalesce(a.House_ID, b.House_ID)
  ,case when a.col1 <> b.col then 'a: || a.col1 || ' b:' || b.col1 end 
  ...
from 
 ( select ....) as a
full join
 ( select ....) as b
on a.ZIP_CODE = b.ZIP_CODE
and a.House_ID = b.House_ID
and ( a.col1 <> a.col1 or
      a.col2 <> a.col2 or
      a.col3 <> a.col3 or
      ...
    )   

如果列可以为 NULL,则需要添加更多条件检查 两列之一是否为 NULL。当然,这种比较语法可以使用现有的元数据自动创建....

【讨论】:

以上是关于如何查找内容表 SQL 中的差异的主要内容,如果未能解决你的问题,请参考以下文章

查找 SQL 表之间的差异

SQL:查找具有非唯一特征 ID 的两个表之间的差异?

在 MS Access 或 SQL Server 中查找 2 个表之间的差异

查找两个日期之间的差异 Oracle SQL

怎么在数据库所有的表中查找数据

在 pyspark sql 中查找两个时间戳之间的差异