データベースのデータ重複排除を説明する例

この記事は、Gauss Squirrel Club Assistant 2 による Huawei クラウド コミュニティ「GaussDB データベース SQL シリーズ - データ重複排除」から共有されたものです。

I.はじめに

データ重複排除は、データベースにおいて比較的一般的な操作です。複雑なビジネス シナリオ、複数の事業分野からのデータ ソースなどにより、重複データの保存が発生します。この記事では、実験プラットフォームとして GaussDB データベースを使用し、重複を削除する方法を詳しく説明します。

2. データ重複排除アプリケーションのシナリオ

データベース管理(バックアップを含む) :データベース内のデータ重複排除により、データの保存とバックアップの繰り返しが回避され、データベースの保存効率が向上し、バックアップ ストレージのコストが削減されます。 

データ統合:データ統合のプロセスでは、複数のデータ ソースからのデータをマージする必要がありますが、重複排除により、マージ結果への重複データの影響を回避できます。 

データ分析(またはマイニング) :データ分析またはデータマイニングを実行する場合、重複排除により、分析またはマイニング結果に対する繰り返しデータの干渉を回避し、分析の精度を向上させることができます。 

電子商取引プラットフォーム:電子商取引プラットフォームで製品の重複を排除すると、同じ製品を繰り返し出品することが回避され、プラットフォームのユーザー エクスペリエンスが向上します。 

財務リスク管理:財務リスク管理の分野では、重複排除によりリスク管理モデルに対する重複データの影響を回避し、リスク管理の精度を向上させることができます。 

3. データ重複排除のケース (GaussDB)

実際のビジネスシナリオ + GaussDB データベース

1. シーンの説明例

保険業界における顧客情報の重複排除を例に挙げると、代理店が顧客に繰り返し連絡すること(顧客からの苦情が発生しやすい)を防ぐために、顧客を一意に識別する必要があります。以下の 2 つの状況では、個人を (一意に) 識別する必要があり、この場合、データの重複排除を実行する必要があります。

• 状況 1: 同じ顧客が異なるソース チャネルを持っています。顧客は生命保険と損害保険の両方を購入しました (2 つの異なるソース システム)。

• シナリオ 2: 同じ顧客が複数回返品する: 顧客は同じチャネルから複数回購入します (同じ保険タイプの異なる商品の更新または購入)。

2. 重複データを定義する

「名前+文書種類+文書番号」で本人であることを識別する、つまりこの3つのフィールドが繰り返されている限り、そのデータは重複データとみなされます。(もちろん、「名前 + ID タイプ + ID 番号 + 携帯電話番号 + ナンバー プレート番号」など、より複雑なシナリオもありますが、今回は詳しく紹介しません)。

3. 重複排除ルールを策定する

1) 複数の中から 1 つを選択します

• ランダム: 重複排除ルールに従って、データの一部がランダムに保持されます。

• 優先順位: 重複排除ルール + ビジネス ロジックに従って、最初に必要なデータを保持します。例えば「家や車を持っているかどうか」を優先します。

2) オールインワン

• 重複データを 1 つのデータにマージします。マージ ルールはビジネス ロジックに基づいて決定されます。

4. テストデータ(GaussDB)の作成

顧客情報欄には主に「氏名、性別、生年月日、書類の種類、書類番号、出所、車の有無、住宅の有無、婚姻状況、携帯電話番号…」などの情報が含まれます。

--顧客情報テーブルの作成

CREATE TABLE 顧客(

名前 VARCHAR(20)

、セックスINT

、誕生日 VARCHAR(10)

,ID_type INT

,ID_番号 VARCHAR(20)

,ソース VARCHAR(10)

,IS_車INT

,IS_ハウスINT

,婚姻状況 INT

,電話番号 VARCHAR(15)

);
--テストデータを挿入

INSERT INTO customer VALUES('張三','1','1988-01-01','1','61010019880101****','生命保険','1','1','1' 、'');

INSERT INTO customer VALUES('張三','1','1988-01-01','1','61010019880101****','自動車保険','1','0','1' 、'');

INSERT INTO customer VALUES('张三','1','1988-01-01','1','61010019880101****','','','','','186** **0701');

INSERT INTO customer VALUES('李思','1','1989-01-02','1','61010019890102****','生命保険','1','1','1' 、'');

INSERT INTO customer VALUES('李思','1','1989-01-02','1','61010019890102****','自動車保険','1','0','1' 、'');

INSERT INTO customer VALUES('李思','1','1989-01-02','1','61010019890102****','','','','','186** **0702');
--結果の表示

顧客から * を選択します。

ヒント: INT 型の一部のフィールド値はディクショナリ テーブルの値を取得しますが、ここでは省略します。

5. 重複排除メソッドを作成する (GaussDB)

次の例には、データ クリーニング、データの感度解除、ビジネス ロジックなどの過剰な処理は含まれていません。これらの手順は「前処理」として推奨されます。この例では、重複排除のプロセスの説明に重点を置いています。

1 )ランダム保持:ビジネス ロジックに従って、レコードはランダムに保持されます。

選択する *

FROM (選択 *

,ROW_NUMBER() OVER (PARTITION BY name,id_type,id_number ) as row_num

お客様より)

WHERE 行番号 = 1;

説明:

• ROW_NUMBER(): 最初の行から始めて、各行に一意の連続番号が割り当てられます。

• PARTITION BYcol1[,col2...]:重複排除キー「名前、IDタイプ、ID番号」などのパーティションカラムを指定します。

• WHERE row_num = 1: ROW_NUMBER() によって生成された数値 1 を取得します。

2)優先保持ビジネスロジックに従い、携帯電話番号を含むレコードが最初に保持され、携帯電話番号を含むレコードが複数ある場合、または携帯電話番号の有無に応じてランダムに保持されます

-- 携帯電話番号を含む記録行を保持します。

tを選択*

FROM (選択 *

,ROW_NUMBER() OVER (PARTITION BY name,id_type,id_number ORDER BY tel_number ASC) as row_num

お客様より)

WHERE t.row_num = 1;

説明:

• ROW_NUMBER(): 最初の行から始めて、各行に一意の連続番号が割り当てられます。

• PARTITION BYcol1[,col2...]:重複排除キー「名前、IDタイプ、ID番号」などのパーティションカラムを指定します。

• ORDER BYcol [asc|desc]: ソートする列を指定します。昇順 (ASC) は最初の行のみを保持することを意味し、降順 (DESC) は最後の行を保持することを意味します。

• WHERE row_num = 1: ROW_NUMBER() によって生成された数値 1 を取得します。

3)マージ保持:ビジネス ロジックに基づいて、高い整合性と精度でフィールド情報をマージします。例えば、携帯電話番号が含まれるレコード行が優先して入力されますが、入力が必要な項目は「車の有無、住宅の有無、婚姻状況」であり、その値はソースが「自動車保険」である対応するレコード。

-- マージして保持

t1.nameを選択します

、t1.セックス

            、t1.誕生日

            ,t1.id_type

            ,t1.id_number

            ,t1.ソース

            ,t2.is_car

            ,t2.is_house

            ,t2.marital_status

            ,t1.電話番号

から

(選択してください。*

FROM (選択 *

,ROW_NUMBER() OVER (PARTITION BY name,id_type,id_number ORDER BY tel_number ASC) as row_num

お客様より)

WHERE t.row_num = 1) t1

左結合

(選択する *

お客様から

WHERE source ='车险' および is_car が NULL ではなく、is_house が NULL ではなく、marital_status が NULL ではない) t2

ON t1.name =t2.name

および t1.id_type=t2.id_type

および t1.id_number=t2.id_number

説明:

t1 テーブルは、携帯電話を含むレコード行の保持 (重複の削除) を優先し、メイン テーブルとして機能します。t2 テーブルは、入力する必要があるフィールドのソース テーブルです。2 つのテーブルは「名前 + 証明書の種類 + 証明書番号」によって関連付けられ、必要な情報をマージします。

6. 添付ファイル: すべてのフィールドの重複排除

たとえば、データベース アプリケーションでは、誤操作の繰り返しやデータの二重化などによりすべてのフィールドが重複した場合、この時点で重複排除も実行する必要があります。先ほど紹介した 3 つの方法に加えて、キーワード DISTINCT および UNION を使用して重複を削除することもできますが、データ量と SQL パフォーマンスに注意する必要があります。(自分でテストしてください)

1 )  DISTINCT (すべてに次の 3 つのフィールドがあると仮定します) 

2 )  U NION (すべてに次の 3 つのフィールドがあると仮定)

4. データ重複排除の効率を向上させるための提案

最良の重複排除は、実際には、ソースでデータを「インターセプト」することです。もちろん業務フロー上、完全に回避することはできませんが、重複除去の効率を向上させることは可能です。

適切な重複排除アルゴリズムを選択する 

データセットの特性と規模に応じて、適切な重複排除アルゴリズムを選択することで、重複排除効率を大幅に向上させることができます。

データストレージ構造の最適化 

ハッシュ テーブルや B+ ツリーなどの適切なデータ ストレージ構造を使用すると、データの検索と比較が高速化され、重複排除の効率が向上します。

並列処理 

並列処理を使用して、データ セットを複数のサブセットに分割し、重複排除処理を個別に実行し、最後に結果をマージします。これにより、重複排除を大幅に高速化できます。

インデックスを使用して検索を高速化する 

データ セット内のキー フィールドにインデックスを付けると、検索と比較が高速化され、重複排除の効率が向上します。

プレフィルタリング 

プレフィルタリングを使用すると、最初にデータセットに対していくつかの単純なフィルタリングと処理 (NULL 値の削除、無効な文字の削除など) を実行します。これにより、比較の数が減り、重複排除の効率が向上します。

重複排除結果キャッシュ(一時テーブル) 

重複排除結果をキャッシュすると、計算の繰り返しを回避できるため、重複排除の効率が向上します。

•書き換え(バックアップ)は非推奨 

一部のパーティション テーブルを使用する場合、重複排除された結果セットを運用テーブルに直接書き換えたり、一時的な代替テーブルを作成したり、バックアップ後の操作を実行したりすることはお勧めできません。

5. まとめ

データ重複排除には、重複データの発見、重複排除ルールの定義、重複排除の方法と効率、重複排除の難しさと課題など、幅広い側面が含まれます。ただし、重複排除の原則は 1 つだけあり、それはビジネス指向であることです。重複データを定義し、ビジネス ニーズに基づいて重複排除のルールと計画を策定します。GaussDB データベースの使用中には、重複シナリオも発生します。この記事では、アプリケーションの背景、ケース、重複ソリューションなどを紹介します。テストとコミュニケーションへようこそ。

クリックしてフォローし、できるだけ早くHuawei Cloudの新しいテクノロジーについて学びましょう~

Alibaba Cloudが深刻な障害に見舞われ、全製品が影響(復旧) Tumblr がロシアのオペレーティングシステムAurora OS 5.0 を冷却新しいUIが公開 Delphi 12とC++ Builder 12、RAD Studio 12多くのインターネット企業がHongmengプログラマーを緊急採用UNIX時間17 億時代に突入しようとしている (すでに突入している) Meituan が兵力を募集し、Hongmeng システム アプリの開発を計画Amazon が Linux 上の .NET 8 への Android の依存を取り除くために Linux ベースのオペレーティング システムを開発独立した規模はFFmpeg 6.1「Heaviside」がリリースされまし
{{名前}}
{{名前}}

Ich denke du magst

Origin my.oschina.net/u/4526289/blog/10141349
Empfohlen
Rangfolge