0

マスターテーブルに多くの重複があります。次の例を参照してください。顧客 ABC Corp はマスター テーブルに 3 回存在し、3 つの CustID すべてが Orders テーブルで参照されています。

**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>

Data Quality Services を使用して Customers テーブルから重複する Customers を削除し、ALSO を使用して Orders テーブルを更新して変更を反映するにはどうすればよいですか。

つまり、CustID 1003 と 1004 は 1001 にマージされ、Orders テーブルの 1003 と 1004 も 1001 に更新する必要があります。

私がこれまでにやってきたこと。CustName のシノニムを使用して顧客のナレッジ ベースを作成し、主要な値を定義しました。次に、DQS でデータ クレンジング プロジェクトを作成し、データを分析してから、マスター データを修正し、それらの修正された値を顧客のナレッジ ベースにインポートしました。SSIS の DQS クレンジング変換は、ソース テーブルと DQS KB に接続することでこれを自動的に行い、一致する行と一致しない行を提供することを理解しましたが、ここから何をすべきかまだわかりません。Customers テーブルのデータがどのように修正され、それに応じて Orders テーブルが更新されたか。提案してください。これまで見てきた例では、テーブルと単純な Excel シートだけでかなり基本的なものを使用しています。

4

2 に答える 2

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

Sum()、Count()、Min() などのPartition By 句で SQL 集計関数を使用できます。

下の Delete コマンドは、ルックアップ テーブル内の重複行を削除します。おそらく、テーブルから行を削除するのではなく、フラグ フィールドを使用して非アクティブに設定することをお勧めします。

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 に答える