2016-10-14 6 views
1

私は単一のidに対して複数のレコードを生成する次のクエリを持っています。私は1つのレコードにこれらの複数のレコードをマージする方法を把握しようとしている:複数のレコードを1つのレコードにマージする

SELECT DISTINCT id, gender, dateofbirth, city, state, zip 
FROM t 

これは私に次のResultSetを与える可能性があります

1, M, 2000-01-01, dallas, tx, 12345 
1, M, 2000-01-01, NULL, NULL, NULL 

私がしたいことは、単一のレコードです:

1, M, 2000-01-01, dallas, tx, 12345 

第二行は、異なるデータを有する場合に同様のシナリオが発生する:

1, M, 2000-01-01, dallas, tx, 12345 
1, M, 2000-01-01, houston, tx, 67890 

この場合、idごとに1つのレコードしか持たないために、レコードの1つを選択し、もう一方を無視したいと思うでしょう。

PostgreSQLでこれを行う方法はありますか?私は役に立たない合体を試み、これを処理する方法があるかどうか疑問に思っています。

+0

そのテーブルにプライマリキーがなく、固有の列はありませんか? – michaJlS

+1

'1、M、2000-01-01、NULL、NULL、45678'と' 1、M、2000-01-01の行が2行(表示した行に加えて)2行追加されているとしたらどうでしょうか? 、NULL、 'wa'、NULL'すべての列がNULLでない行を少なくとも1つは常に持っていますか? –

答えて

0
Select * from 
(select a.*, row_number() over (partition by id order by city desc)rn 
From tablename a 
) b where rn=1 

上記のクエリは、常にidのレコードを1つ返します。値がcityとnullの複数の値がある場合、クエリはcityの値を持つレコードを取得します。

+0

私はそれが好きです - そのパーティションロジックは常にループのために私をスローします。助けてくれてありがとう。 – BDad

1

以下のクエリは、少なくともあなたのサンプルデータでは動作しているようです。デモのためにフィドルを見てください。私はMySQLを使用しました。なぜなら、Fiddleは他のデータベースタイプを破る傾向があるからです。

SELECT t1.* 
FROM yourTable t1 
INNER JOIN 
(
    SELECT id, MAX(city || ', ' || state || ', ' || zip) AS location 
    FROM yourTable 
    GROUP BY id 
) t2 
    ON t1.id = t2.id AND 
     t1.city || ', ' || t1.state || ', ' || t1.zip = t2.location 

SQLFiddle

私が使用するトリックは都市、国家を連結することで、単一の文字列に圧縮し、その後id値のグループの最大値を選択してください。これは、2つの異なるアドレスから何とか同じ文字列を形成することができないと仮定して動作します。私はこれがあなたの米国の住所様式に当てはまると思います。

+0

このようなアプローチの唯一の問題は、異なる行のデータを混在させる可能性があることです。 – michaJlS

+0

@michaJlSすごく速いです。 Gordon Linoffが到着する前にこれを修正できるかどうかを見てみましょう。 –

+0

私が覚えているのは、MySQLではフィールドに集約関数を適用できないことです(http://stackoverflow.com/questions/2197693/any-reason-for-group-by-clause-without-aggregation-function)しかし、それがpsqlで同じように動作するかどうかは分かりません。 – michaJlS

関連する問題