2016-07-16 11 views
1

私は6,500万行と140個強のテーブルを持っています。データはいくつかの情報源から得られ、少なくとも毎月提出されます。いくつかのフィールドがNULLである多くのフィールドで異なる情報を取得します。

私は、このデータから特定のフィールドを一意に特定するだけの簡単な方法を探します。つまり、どの請求書をどの識別番号で送信したのか、誰によって送信されたのかをリンクするためのすべての情報を処理したいのです。問題は、私は6500万以上のレコードを反復したくないということです。私が別個の価値を得ることができれば、私は6500万人ではなく500万人のレコードを処理するだけで済むでしょう。データの説明はSQL Fiddle、サンプルは

invoice_numberを毎月passport_number_1, national_identity_number_1 and driving_license_1にリンクして送信すると、これが表示されるのは1行だけです。彼らはnational_identityフィールドが故に全く新しいですので、passport_number_1, national_identity_number_2 and driving_license_1にリンクされて、私もこの行を選択したいinvoice_number送っ31月に、その後30ヶ月間以上を提出する場合、すなわち4つのフィールドは

一意であることが持っています行は、私は、彼らが一点で発生するヌルを持っているために、その可能性のすべてのフィールドについては、同じ行

  • に表示されるわけlinked toことで

    • ユニークです。
    • 'ピボット/コンポジット'列はinvoice_numberで、 submitted_byです。それらのいずれかが存在しない場合は、その行を削除してください
    • また、上記のデータとともにdatabase_idを含める必要があります。すなわち postgresqlデータベースによって自動生成されるprimary_id
    • 返される必要のないフィールドは、other_column およびyet_another_columnです。テーブルを覚えておいてください140列はので、このユニークな 記録

    は、シナリオを再現しようとする試みのために、このSQL fiddleを参照してください保持する新しいテーブルを作成し、それらを結果と

  • を必要としません ました。

    そのフィドルから、私のような結果を期待したい:

    • 行1を、2 &行11:彼らは正確に 同じようにそれらの1つだけ保存しなければなりません。好ましくは、最小値がidの行。
    • 行4と行9:それらのうちの1つは、正確には であるため、削除されます。
    • 行5,7、& 8: invoice_numberまたはsubmitted_byのいずれかが欠落しているため、削除されます。
    • 結果はRow(1,2、または11)、3、(4または9)、6および10になります。
  • +0

    期待される結果がどういうものか分かりません。 4つのフィールドが同じで、他のフィールドも取得したいセットから1行だけを必要としているとします。あなたは何行目か気にしないなら、なぜその列の 'id'は重要なのでしょうか? – binoternary

    +0

    「彼らのうちの1人は落ちるだろう」は、「彼らのうちの1人だけが保管される」とすべきである。どちらが重要か? –

    +0

    @ErwinBrandstetter訂正していただきありがとうございます。あなたに答えるために、いいえ、どれを保つかは関係ありません。好ましくは、最初に現れるものを保持したいと思っています。 – lukik

    答えて

    2

    4つの別個のフィールドを持つグループから(追加のフィールドを持つ)一つの代表行を取得するには:あなたが発注(documentation on distinct)を指定しない限り、正確に返される行予測不可能であることを

    SELECT 
    distinct on (
        invoice_number 
        , passport_number 
        , national_id_number 
        , driving_license_number 
    ) 
        * -- specify the columns you want here 
    FROM my_table 
    where invoice_number is not null 
    and submitted_by is not null 
    ; 
    

    注意

    編集:idことで、この結果を注文する

    は、単にを追加最後までは動作しませんが、それはCTE

    with distinct_rows as (
        SELECT 
        distinct on (
         invoice_number 
         , passport_number 
         , national_id_number 
         , driving_license_number 
         -- ... 
        ) 
         * -- specify the columns you want here 
        FROM my_table 
        where invoice_number is not null 
        and submitted_by is not null 
    ) 
    select * 
    from distinct_rows 
    order by id; 
    

    または元のクエリを作るこの中から特定のフィールドをつかむために、サブクエリ

    select * 
    from (
        SELECT 
        distinct on (
         invoice_number 
         , passport_number 
         , national_id_number 
         , driving_license_number 
         -- ... 
        ) 
         * -- specify the columns you want here 
        FROM my_table 
        where invoice_number is not null 
        and submitted_by is not null 
    ) t 
    order by id; 
    
    +0

    2番目のオプションは何を探しています。 [この結果](http://sqlfiddle.com/#!15/a4568/38)を参照してください。このクエリとIDで注文を実行するにはどうすればよいですか? – lukik

    +0

    あなたはIDで区別できません...このようにIDは行ごとに異なります – scaisEdge

    +0

    私のコメントは注文を依頼していました。明確ではない。 – lukik

    0

    簡単な方法を使用してeiterことによって行うことができますユニークなデータのみ

    私はそうは思わない。私はあなたが別のの行が一意ではない表から選択することを意味すると思います。

    は、私の知る限り、あなたの説明から言うことができるように、あなたは、単にあなたのSQLFiddle例で

    SELECT distinct invoice_number, passport_number, 
           driving_license_number, national_id_number 
    FROM my_table 
    where invoice_number is not null 
    and submitted_by is not null; 
    

    をしたい、それが5行を生成します。

    関連する問題