FTP サイトに毎日アップロードされるアドレスの CSV ファイルを使用しています。住所レコードは、Address_Line1、Address_Line2、City、State、Zip_Code、および Country で構成されます。CSV に重複するアドレスが複数あります。私の仕事は、CSV ファイル内のすべての住所を既存の住所次元と比較し、新しい住所のみをロードすることです。これを行うには、まず CSV からステージング テーブルに読み込み、次に次のクエリを実行してハッシュを生成し、比較を行います。
UPDATE STG_ADDRESS
SET ADDRESS_HASH = HASHBYTES(
'SHA1'
,ISNULL(ADDRESS_LINE1, 'N/A') +
ISNULL(ADDRESS_LINE2, 'N/A') +
ISNULL(CITY, 'N/A') +
ISNULL(STATE, 'N/A') +
ISNULL(ZIP_CODE, 'N/A') +
ISNULL(COUNTRY, 'N/A'));
これは、1 つの例外を除いて正常に機能しています。HASHBYTES 関数は、まったく同じアドレスに対して複数のハッシュを生成しています。今日のアップロードでは、次のクエリを実行し、37 個の個別のアドレスを取得しました。
SELECT DISTINCT
ISNULL(ADDRESS_LINE1, 'N/A')
+ ISNULL(ADDRESS_LINE2, 'N/A')
+ ISNULL(CITY, 'N/A')
+ ISNULL(STATE, 'N/A')
+ ISNULL(ZIP_CODE, 'N/A')
+ ISNULL(COUNTRY, 'N/A')
FROM STG_ADDRESS
ハッシュで更新した後、次のクエリを実行し、43 レコードを取得しました。
SELECT DISTINCT
ISNULL(ADDRESS_LINE1, 'N/A')
+ ISNULL(ADDRESS_LINE2, 'N/A')
+ ISNULL(CITY, 'N/A')
+ ISNULL(STATE, 'N/A')
+ ISNULL(ZIP_CODE, 'N/A')
+ ISNULL(COUNTRY, 'N/A')
,ADDRESS_HASH
FROM STG_ADDRESS
次のクエリでこれを再確認しました。
SELECT DISTINCT
ISNULL(ADDRESS_LINE1, 'N/A')
+ ISNULL(ADDRESS_LINE2, 'N/A')
+ ISNULL(CITY, 'N/A')
+ ISNULL(STATE, 'N/A')
+ ISNULL(ZIP_CODE, 'N/A')
+ ISNULL(COUNTRY, 'N/A')
,COUNT(ADDRESS_HASH)
FROM STG_ADDRESS
GROUP BY
ISNULL(ADDRESS_LINE1, 'N/A')
+ ISNULL(ADDRESS_LINE2, 'N/A')
+ ISNULL(CITY, 'N/A')
+ ISNULL(STATE, 'N/A')
+ ISNULL(ZIP_CODE, 'N/A')
+ ISNULL(COUNTRY, 'N/A')
HAVING COUNT(ADDRESS_HASH) > 1
また、SQL サーバーが SELECT DISTINCT の実行時に同じと見なす 6 つのアドレスがあることを確認しましたが、ハッシュの作成時に何らかの形で異なると見なします。
同じ文字列で別のハッシュが作成されるシナリオはありますか? もしそうなら、問題を修正するために何ができますか?