我已经有8000万条记录插入到表中,但需要确保一些列是共同唯一的。但是,列已包含非唯一数据,因此ALTER TABLE不起作用。
我想要一个能让我轻松删除非唯一记录的查询,同时保留其中一个记录,或者允许我将当前表中的数据加载到新表中的记录,同时过滤为了独特。
答案 0 :(得分:5)
您正在寻找的查询是:
select distinct on (my_unique_1, my_unique_2) * from my_table;
这为distinct on
中的每个列组合选择一行。实际上,它总是第一个行。它很少在没有order by
的情况下使用,因为没有可靠的顺序返回行(因此是第一个)。
结合order by
,您可以选择第一行(这会留下具有最大last_update_date的行):
select distinct on (my_unique_1, my_unique_2) *
from my_table order by my_unique_1, my_unique_2, last_update_date desc;
现在您可以将其选择为新表:
create table my_new_table as
select distinct on (my_unique_1, my_unique_2) *
from my_table order by my_unique_1, my_unique_2, last_update_date desc;
或者您可以将其用于删除,假设row_id
是主键:
delete from my_table where row_id not in (
select distinct on (my_unique_1, my_unique_2) row_id
from my_table order by my_unique_1, my_unique_2, last_update_date desc);