6

私はSQLにかなり慣れていないので、この質問が奇妙に聞こえる場合はお詫び申し上げます。

貧弱なデータの問題に遭遇し続けています。例として、London は LON、London UK、London England などとして保存できます。SQL を使用する前は、最初の列にオリジナルがあり、2 番目のヘルパー列に修正された Excel ルックアップ テーブルがたくさんありました。バージョン。例として:

Name             Name_1
London, UK       London
Lon              London
LON              London
London           London
London, England  London
LND              London

SQLでこれを行う簡単な方法はありますか? 現在、ルックアップ テーブルを作成して結合を使用しようとしています。すべてのインスタンスを常に修正できるとは限らないため、これはややこしくなっています。そのため、ほとんどのシナリオでは、ルックアップ テーブルには、結合先のテーブルよりも項目が少なくなっています。

私はストアド プロシージャについて独学してきましたが、これで問題が解決するかどうか疑問に思いました。問題は、ルックアップ テーブルに関する私の検索が空になることです。

これができないと言うだけであっても、アドバイスやポインタはありがたく受け取られます。

いつもお世話になっております、長い文章で申し訳ありません。

4

4 に答える 4

2

ルックアップ テーブルに結合し、そこに指定された値を使用することをお勧めします。見つからない場合は、オリジナルを使用します。

SELECT t1.FirstName, LookupField = ISNULL(t2.Name_1, t1.LookupField)
FROM People as t1
LEFT INNER JOIN TableLookupCities as t2 ON t1.LookupField = t2.Name

各名前について、一致するものが最大で 1 つであることを確認してくださいTableLookupCities。そうしないと、結合によって複数の結果が生成されます。に一意のインデックスを作成しますTableLookupCities.Name:

CREATE UNIQUE (CLUSTERED) INDEX djgndkg ON TableLookupCities (Name) INCLUDE (Name_1)
于 2013-10-17T12:44:43.217 に答える
1

他に何もする必要はありません。翻訳がない場合は原本を返すだけです。

SELECT
t1.FirstName,
t1.LookupField,
case when t2.Name_1 is null 
    then t1.lookupfield 
    else t2.name_1 end Name_1
FROM People as t1
LEFT INNER JOIN TableLookupCities as t2
ON t1.LookupField = t2.Name
于 2015-02-26T15:23:54.873 に答える
0

前述のように、不良データはそれ自体の問題です。データ クリーニングはそれ自体が 1 つの産業であるため、この種の問題に対しては、シンプルで簡単なものから、すべての機能を修正するための精巧な試みまで、幅広い選択肢があります。何が「最適」かは、状況とニーズによって異なります。

確かに、このルックアップ テーブルを拡張し続けて、増加する標準エラー/バリエーションに対応することは可能ですが、これが一定の情報の流れである場合、メンテナンスのオーバーヘッドが生じます。これはあなたのニーズに十分に対応できるかもしれません。

自動化されたアプローチのスケーラビリティのために、手動による人間の介入の信頼性を交換することは非常に一般的な場所です。これは保守と拡張がはるかに簡単ですが、(問題の性質によっては) 間違いを犯す可能性があります。

例 1. パターン ベースのアプローチ (Contains、LIKE、RegEx) を使用して、妥当と思われるものを見つけます。Name_1 が静的で十分に理解されたリストである場合など、状況によってはこれで問題ない可能性があるため、通常は十分な結果が得られることを確認できます。+ セットアップ/理解が簡単 + 完全なリストよりも柔軟 - まだ少しメンテナンスが必要 - 複雑な状況や理解が不十分な状況では絶望的

例 2. より一般的なケースでは、データベースが提供するテキスト検索機能を使用して、ある値が他の値とどの程度一致しているかを「スコアリング」し、最適な一致オプションを選択できます。繰り返しますが、これはすべてのコンテキストで絶対確実または安全というわけではありません。また、セットアップに多少の手間がかかりますが、はるかに堅牢です。これはもう少しパフォーマンスが集中するため、関連するデータセットのサイズ、作業のタイムスケール、および利用可能なインフラストラクチャも考慮する必要があります。+ 成功率がかなり高い - セットアップが遅い - パフォーマンスのオーバーヘッドが大きい

例 3. もう 1 つのオプションは、よりドメイン固有のものです。この場合、これは空間データであるため、検証の手段としてサード パーティのジオコーディング サービスを使用できます。+ 高い成功率 + 膨大な範囲の値を処理できる - 追加コストが発生する可能性がある - セットアップが最も難しい/最も遅い

于 2013-10-17T12:27:23.620 に答える
0

要するに... 悪いデータは悪いデータであり、悪いデータを使用するか、悪いデータを消去するか、またはその両方を行うには多くの作業が必要です。

明確化後に更新

独自の ETL (抽出、変換、読み込み) プロセスを構築して、すべてのバリアントの受信データを処理します。ETL プロセスは、新しい "Bad Data" バリアントをトラップする必要があるため、受け取るデータの新しいバッチごとに変更される可能性が高くなります。

データを ALL VARCHAR テーブルにインポートする
ETL プロセスを実行する

  • 良いデータが実際のデータ テーブルに入る
  • 不良データが例外テーブルに入る

ETL プロセスの変更を繰り返し 、例外がなくなるまで
ETL プロセス
を実行します。

-- 更新終了

LEFT JOIN を使用すると、欠落している値をかなり簡単に特定できます。

SELECT
t1.FirstName,
t1.LookupField,
t2.Name_1
FROM People as t1
LEFT INNER JOIN TableLookupCities as t2
ON t1.LookupField = t2.Name

どこでも t2.Name_1 が NULL を返す場合、ルックアップ テーブルにその「LookupField」を追加する必要があることがわかっています。データベース設計を学ぶのに良い本はここにあります単なる人間のためのデータベース設計

-- Group By to Find Missing Unique Values
t1.LookupField,
t2.Name_1
FROM People as t1
LEFT INNER JOIN TableLookupCities as t2
ON t1.LookupField = t2.Name
GROUP BY 
t1.LookupField,
t2.Name_1
于 2013-10-17T12:18:46.687 に答える