6,500 万行と 140 列をわずかに超えるテーブルがあります。データは複数のソースから取得され、少なくとも毎月送信されます。
このデータから特定のフィールドを一意に取得する簡単な方法を探しています。つまり、すべての情報を処理して、どの請求書がどの識別番号で送信され、誰から送信されたかをリンクしたいと考えています。問題は、6,500 万件を超えるレコードを反復処理したくないということです。個別の値を取得できれば、たとえば 6,500 万件ではなく、500 万件のレコードを処理するだけで済みます。データの説明については以下を参照し、サンプルについてはSQL Fiddleを参照してください。
invoice_number
クライアントがリンク先をpassport_number_1, national_identity_number_1 and driving_license_1
毎月送信するとしたら、これが表示される行は 1 つだけ必要です。つまり、4 つのフィールドは一意である必要があります
上記を 30 か月間送信すると、31 か月目にinvoice_number
リンク先が送信されます。フィールドが新しいため、行全体が一意であるためpassport_number_1, national_identity_number_2 and driving_license_1
、この行も選択したいと思います。national_identity
linked to
つまり、それらは同じ行に表示されます- すべてのフィールドで、ある時点で Null が発生する可能性があります。
- 「ピボット/複合」列は、invoice_number と submit_by です。それらのいずれかが存在しない場合は、その行を削除します
- また、上記のデータに database_id を含める必要があります。つまり、postgresql データベースによって自動生成される primary_id
- 返す必要のない唯一のフィールドは
other_column
andyet_another_column
です。テーブルには 140 列あるので必要ないことに注意してください - 結果を使用して、この一意のレコードを保持する新しいテーブルを作成します
シナリオを再現する試みについては、このSQL フィドルを参照してください。
そのフィドルから、次のような結果が期待されます。
- 行 1、2、および行 11: まったく同じであるため、1 つだけを保持する必要があります。できれば最小の行
id
。 - 行 4 と行 9: まったく同じなので、そのうちの 1 つが削除されます。
- 行 5、7、および 8:
invoice_number
またはが欠落しているため、削除されsubmitted_by
ます。 - 結果は行 (1、2、または 11)、3、(4、または 9)、6、および 10 になります。