user1045047 が述べたように、Amazon Redshift は一意の制約をサポートしていないため、delete ステートメントを使用してテーブルから重複レコードを削除する方法を探していました。最後に、私は合理的な方法を見つけました。
Amazon Redshift は、自動生成された一意の番号を格納する IDENTITY 列の作成をサポートしています。
http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html
次の SQL は、PostgreSQL が一意の列である OID を持つ重複レコードを削除するためのもので、OID を ID 列に置き換えることでこの SQL を使用できます。
DELETE FROM duplicated_table WHERE OID > (
SELECT MIN(OID) FROM duplicated_table d2
WHERE column1 = d2.dupl_column1
AND column2 = d2.column2
);
これは、Amazon Redshift クラスターでテストした例です。
create table auto_id_table (auto_id int IDENTITY, name varchar, age int);
insert into auto_id_table (name, age) values('John', 18);
insert into auto_id_table (name, age) values('John', 18);
insert into auto_id_table (name, age) values('John', 18);
insert into auto_id_table (name, age) values('John', 18);
insert into auto_id_table (name, age) values('John', 18);
insert into auto_id_table (name, age) values('Bob', 20);
insert into auto_id_table (name, age) values('Bob', 20);
insert into auto_id_table (name, age) values('Matt', 24);
select * from auto_id_table order by auto_id;
auto_id | name | age
---------+------+-----
1 | John | 18
2 | John | 18
3 | John | 18
4 | John | 18
5 | John | 18
6 | Bob | 20
7 | Bob | 20
8 | Matt | 24
(8 rows)
delete from auto_id_table where auto_id > (
select min(auto_id) from auto_id_table d
where auto_id_table.name = d.name
and auto_id_table.age = d.age
);
select * from auto_id_table order by auto_id;
auto_id | name | age
---------+------+-----
1 | John | 18
6 | Bob | 20
8 | Matt | 24
(3 rows)
また、このような COPY コマンドでも動作します。
この方法の利点は、DDL ステートメントを実行する必要がないことです。ただし、ID 列を既存のテーブルに追加することはできないため、ID 列を持たない既存のテーブルでは機能しません。既存のテーブルと重複するレコードを削除する唯一の方法は、このようにすべてのレコードを移行することです。(user1045047の回答と同じ)
insert into temp_table (select distinct from original_table);
drop table original_table;
alter table temp_table rename to original_table;