回答が遅れて申し訳ありません。私はここ数日、ちょっと忙しかった。
以下
は、以下の仮定に基づいて私の答えです:
1)あなたは、いくつかの他の機構を介して名前のスペルの問題をクリーンアップされます(あなたがあなたの元にコメントで正規表現を使用してそれをクリーンアップするだろうと述べました質問)。
2)DUPセットは、Firstname、Lastname、およびBirth(元の質問のコメントにこれを記載)を使用して識別できます。
3)ファーストネーム、姓、および生年月日はNULLにすることはできません。
4)DUPセットに複数のFINレコードを含めることはできません(元の質問のコメントにこれを記載しています)。
上記のいずれかの仮定が有効でない場合は、私の答えを変更する必要があります。
次は取るべき手順は次のとおりです。
1)非FINレコードからPersonalKeyをコピーするために、すべてのFINレコードを更新します。
UPDATE Pruebas p1
INNER JOIN Pruebas p2
ON p1.Firstname = p2.Firstname
AND p1.Lastname = p2.Lastname
AND p1.Birth = p2.Birth
SET p1.PersonalKey = p2.PersonalKey
WHERE p1.Source like 'FIN%'
AND p1.PersonalKey is null
AND p2.PersonalKey is not null;
2)ここで、すべての非FINレコードを削除します。唯一FIN記録が残されているように、FIN記録を持つすべてのDUPが洗浄されています。この時点で
DELETE p2
FROM Pruebas p1
INNER JOIN Pruebas p2
ON p1.Firstname = p2.Firstname
AND p1.Lastname = p2.Lastname
AND p1.Birth = p2.Birth
WHERE p1.Source like 'FIN%'
AND p2.Source not like 'FIN%';
:我々はFINレコードを持っています。
3)他のすべてのケースでDRVレコードにとどまることにした場合。我々はDRVレコードに別のレコードからPersonalKeyをコピーする必要があります。
UPDATE Pruebas p1
INNER JOIN Pruebas p2
ON p1.Firstname = p2.Firstname
AND p1.Lastname = p2.Lastname
AND p1.Birth = p2.Birth
SET p1.PersonalKey = p2.PersonalKey
WHERE p1.Source like 'DRV%'
AND p1.PersonalKey is null
AND p2.PersonalKey is not null;
4)我々はDRVレコード持っているすべての非DRVレコードの削除:この時点で、すべてのDUPを
DELETE p2
FROM Pruebas p1
INNER JOIN Pruebas p2
ON p1.Firstname = p2.Firstname
AND p1.Lastname = p2.Lastname
AND p1.Birth = p2.Birth
WHERE p1.Source like 'DRV%'
AND p2.Source not like 'DRV%';
をDRVレコードが残っているように、DRVレコードが削除されました。
唯一のレコードタイプがSAレコードの場合は、それ以上DUPが残っていないので、完了です。
5)最も多くの情報が入力されたレコードを選択したい場合や、3と4を終了して複数のレコードタイプが残っていて、DUPが発生している場合。と1以外のすべてのレコードを削除します)
UPDATE Pruebas p1
INNER JOIN Pruebas p2
ON p1.Firstname = p2.Firstname
AND p1.Lastname = p2.Lastname
AND p1.Birth = p2.Birth
SET p1.PersonalKey = p2.PersonalKey
WHERE p1.Source not like 'FIN%'
AND p1.PersonalKey is null
AND p2.PersonalKey is not null;
6:我々はすべての非FINレコードのためにそれを持っていない任意のレコードにそれを持っているDUPセット内の任意のレコードからPersonalKeyをコピーする必要があります(info_score計算列で定義されている)ほとんどの情報:それは利用可能だったとFINレコードが保存された場合、彼らはそれ以外のいずれかDRVレコード存在していた場合、または
DELETE p5
FROM Pruebas p5
INNER JOIN (SELECT p3.Firstname
, p3.Lastname
, p3.Birth
, MIN(p3.Id) AS min_id
FROM Pruebas p3
INNER JOIN (SELECT p1.Firstname
, p1.Lastname
, p1.Birth
, count(*) AS c
, MAX((p1.Name is not null) + (p1.RFC is not null) + (p1.Source is not null) + (p1.PersonalKey is not null)) AS info_score
FROM Pruebas p1
GROUP BY p1.Firstname
, p1.Lastname
, p1.Birth
HAVING count(*) > 1) p2
ON p3.Firstname = p2.Firstname
AND p3.Lastname = p2.Lastname
AND p3.Birth = p2.Birth
AND ((p3.Name is not null) + (p3.RFC is not null) + (p3.Source is not null) + (p3.PersonalKey is not null)) = p2.info_score
GROUP BY p3.Firstname
, p3.Lastname
, p3.Birth) p4
ON p4.Firstname = p5.Firstname
AND p4.Lastname = p5.Lastname
AND p4.Birth = p5.Birth
AND p4.min_id <> p5.Id;
すべてのDUPがPersonalKeyで崩壊してきたこの時点では、保存されました最も情報の多いレコードが保存されました。
ご質問がありましたら教えてください。
は名前、ファーストネーム、姓、誕生、およびRFCが同じであれば、その後で1にDRVソースと1からPersonalKeyをコピーし、
-Dipin
だから、それがお役に立てば幸いFIN Sourceを削除し、FIN以外のすべてを削除しますか? –
私は行がファーストネーム、姓、生年月日によってDUPであることを知っています。 CONCAT( 'FirstName、bla、bla')と完全な名前と出生によってorderyngのようなものです。しかし、私は大規模な方法で変更を行う必要があります.2百万のレジストリがあるからです。 – Granger
しかし、あなたの例では2と3と4から別の姓があります。 –