1

データの入力時点でレコードのgenderが "不明"なので、一部の行がダーティなPostgreSQLの表がありますオブジェクトの一意の識別子であるobject_idで示される同じままです。同じIDを持つ別の行の列の未知の値への更新

object_id       gender 
511E1AC7128EE2E74349896B55461F27 Unknown 
511E1AC7128EE2E74349896B55461F27 Unknown 
511E1AC7128EE2E74349896B55461F27 Male 
56665EA256AB3757CDFA6C1CB4334C91 Female 
56665EA256AB3757CDFA6C1CB4334C91 Female 
56665EA256AB3757CDFA6C1CB4334C91 Unknown 
56665EA256AB3757CDFA6C1CB4334C91 Unknown 
55C3BFDBD327396E912604D6E635D59B Unknown 
55C3BFDBD327396E912604D6E635D59B Unknown 
55C3BFDBD327396E912604D6E635D59B Female 

したがって、私はこのようなことに私のテーブルを更新する:すべて「不明」の列はどんな非未知の値に変換され

object_id       gender 
511E1AC7128EE2E74349896B55461F27 Male 
511E1AC7128EE2E74349896B55461F27 Male 
511E1AC7128EE2E74349896B55461F27 Male 
56665EA256AB3757CDFA6C1CB4334C91 Female 
56665EA256AB3757CDFA6C1CB4334C91 Female 
56665EA256AB3757CDFA6C1CB4334C91 Female 
56665EA256AB3757CDFA6C1CB4334C91 Female 
55C3BFDBD327396E912604D6E635D59B Female 
55C3BFDBD327396E912604D6E635D59B Female 
55C3BFDBD327396E912604D6E635D59B Female 

するobject_idは/いくつかの他のでありエントリ/。または - - より良い - 私は、PostgreSQLでこれを行うことができます方法はありSequelize

+0

そのようなことは、あなたのデータは正規化されない表示されますので、それが最高の状態でパッチワークの解決策になる行われた場合。誰かがあなたにパッチワークソリューションを提供していたなら、彼は依然としてobject_stateがどのようなものかを知る必要があるでしょう。 – e4c5

+0

テーブル定義とPostgresバージョンの通常の疑いがありません。 –

+0

私は 'object_state'の周りのノイズを取り除くために自由をとりました。これは質問に直交していて、気をそらすだけでした。 –

答えて

0

質問が不完全なので、私は現在のPostgresのバージョン9.5と、このテーブル定義を想定していている(JavascriptのORM SQLデータベースのは?):

CREATE TABLE object (
    object_id uuid PRIMARY KEY -- ideally a UUID 
, gender text    -- could probably be boolean 
-- rest irrelevant 
    ); 

次いで、溶液を使用できます

UPDATE object o 
SET gender = sub.gender 
FROM (
    SELECT object_id, min(gender) AS gender 
    FROM object 
    GROUP BY 1 
    ) sub 
WHERE o.object_id = sub.object_id 
AND o.gender IS DISTINCT FROM sub.gender; 

集計またはウィンドウ関数が直接UPDATEで許可されていないので、あなたは、サブクエリを必要としています。

集約関数min()「女性」「男性」text「不明」種類ので、動作するように起こります。 boolean( 'Unknown'はNULLとなります)、min()max()NULLの値を無視します。

最後のWHERE条件はオプションですが、空の更新を避けるために含めることをお勧めします。列が定義されている場合o.gender <> sub.genderに簡略化することができますNOT NULL;

なぜデータ型uuidを使用するのが理想的でしょうか?

+0

これに追加するには、 "unknown"をNULLに切り替えると良いと思うので、2行目を次のように変更します: 'SET gender = NULLIF(sub.gender、 'Unknown')'? – user3264659

+0

@ user3264659:はい、この場合は* all *行を更新したいので、最後の行を削除してください。 –

関連する問題