2016-11-13 8 views
2

2つの行は、タイムスタンプ列以外のすべての列が同じです - created_atpostgresテーブルの2つの重複したエントリに対して1行を削除するにはどうすればよいですか?

これらの行のいずれかを保持したいだけです。

これは、私がこれらの重複した行のうち、値の小さいcreated_at列に基づいて削除できる行の1つを選択する方法です。

select e.id, e.user_id, e.r_needed, e.match, e.status, e.stage, e.created_at 
    from employee e, employee e2 where e.id=e2.id and e.user_id=e2.user_id and 
    e.status = 12 and e2.status=12 and e.stage=false and e2.stage=false and 
    e.match=true and e2.match=true and e.user_id=12 and e.r_needed=true and e2.r_needed=true 
    and e.created_at<e2.created_at and DATE(e.created_at)='2015-10-08'; 

しかし、私は重複の両方が削除されませんし、上記選択されているものだけが行うように、この行を削除する方法を見つけ出すことはできませんか?

基本的には、上記の選択クエリの列に一致するすべての行と、より小さい値のcreated_atを持つ行を削除したいとします。

テーブルにプライマリキーまたはユニークキーがありません。

+0

適切なパーティションで行番号を使用し、行番号が1の場合のみ削除します。 –

+0

@TimBiegeleisen:より良い使い方** row_number> 1 ** **代わりに:) – dnoeth

+0

私は上記のクエリでそれをどのように使用することができますか? – Tisha

答えて

1

かわりに参加の相関サブクエリを使用することができます。

select * from employee e 
where exists 
(select * from employee e2 
    where e.id=e2.id and e.user_id=e2.user_id 
    and e.status = 12 and e2.status=12 and e.stage=false 
    and e2.stage=false and e.match=true and e2.match=true 
    and e.user_id=12 and e.r_needed=true and e2.r_needed=true 
    and e.created_at<e2.created_at 
    and DATE(e.created_at)='2015-10-08' 
); 

これは、重複する行を返した場合、正しくおdelete代わりのselect *に切り替えることができます。

関連する問題