0

我们在主表中有很多重复项。请参见下面的示例,客户 ABC Corp 在主表中存在 3 次,并且在 Orders 表中引用了所有 3 个 CustID。

**Customers Table**
<table>
<tr><td><strong>CustID</strong></td><td><strong>CustName</strong></td></tr>
<tr><td>1001</td><td>ABC Corp.</td></tr>  
<tr><td>1002</td><td>XYZ Corp.</td></tr>  
<tr><td>1003</td><td>ABC Corp Ltd.</td></tr>  
<tr><td>1002</td><td>ABC Corporation Limited.</td></tr>  
</table>


**Orders Table**
<table>
<tr><td><strong>OrderID</strong></td><td><strong>CustID</strong></td></tr>
<tr><td>23425</td><td>1001</td></tr>  
<tr><td>23466</td><td>1003</td></tr>  
<tr><td>23488</td><td>1003</td></tr>  
<tr><td>43877</td><td>1004</td></tr>  
</table>

如何使用数据质量服务从客户表中删除重复的客户,以及如何更新订单表以反映更改。

即 CustID 1003 和 1004 合并到 Orders 表中的 1001 和 1003 和 1004 也需要更新为 1001。

到目前为止我所做的。使用 CustName 的同义词为客户创建知识库并定义领先值。然后在 DQS 中创建数据清理项目并分析数据,然后对主数据进行更正,并将这些更正的值导入客户知识库。我知道 SSIS 中的 DQS 清理转换通过连接到源表和 DQS KB 并提供匹配和不匹配的行来自动执行此操作,但我仍然不明白从这里做什么。客户表中的数据如何更正,订单表如何相应更新。请建议。到目前为止我看到的例子都是使用非常基本的东西,只有一个表格和一个简单的 Excel 表。

4

2 回答 2

1

极客,

当您在最后一步运行SQL Server 数据质量服务项目进行清理时,向导会要求您如何导出结果。

如果选择与目标相同的源表,清洗后会用新数据替换原来的数据

但我认为最好将数据导出到临时表中,然后执行 SQL 查询来更新经过验证的更改

我有一个 CountryList 表。然后通过运行 DQS 项目进行数据清理并将结果(具有清理信息的数据)导出到 SQL Server 数据库中的新表 CountryListDQS

稍后,通过运行类似于下面的 SQL 更新语句,您可以使用来自 DQS 的经过验证的更改来更新原始数据

update dbo.CountryList
set
    country = Q.country_Output
from dbo.CountryList C
inner join dbo.CountryListDQS Q
on C.id = Q.id_Output
where Q.country_Status = 'Corrected'
于 2016-03-07T17:45:29.393 回答
0

在将数据行的清理和匹配列表存储在新的数据库表中后,您可以首先使用新值更新引用表字段(对于该记录的重复项),然后删除查找表中的重复项。

不幸的是,我不知道 DQS 是否可以为我们做到这一点。但以下查询可能会对您有所帮助。

接下来更新一个引用表到 CountryId 字段。我更喜欢将具有最小 Id 值的行保留为原始行,将所有其他行保留为重复行。

;with cte as (
select
    NewCountryId = Min(id_Output) Over (Partition By Country_Output),
    *
from dbo.CountryListDQS
where country_Status = 'Corrected'
)
Update CityList
Set
    CountryId = cte.NewCountryId
From CityList
Inner Join cte on cte.id_Output = CityList.CountryId
where CityList.CountryId <> cte.NewCountryId

您可以使用带有 Partition By 子句的 SQL 聚合函数,例如 Sum()、Count() 或 Min() 等。

并且在删除命令下方删除查找表中的重复行。也许最好使用标志字段设置非活动而不是从表中删除行

with cte as (
select
    rn = ROW_NUMBER() Over (Partition By Country_Output Order By id_Output),
    *
from dbo.CountryListDQS
where country_Status = 'Corrected'
)
delete #CountryListTmp
from #CountryListTmp
inner join cte on #CountryListTmp.id = cte.id_Output
where rn > 1

或者最好保留一份查找表的副本。如果 CountryId 的孤记录缺少外键关系而导致数据完整性问题,您仍然可以在备份表中找到原始记录。

您可以使用 SQL Row_Number() 函数作为其他选项进一步检查如何删除重复行。

最后一点,我不确定 Data Quality Services 是否会删除重复行并将所有其他引用表行映射到原始值。

于 2016-03-08T17:03:42.750 回答