Запрос, который вы ищете:
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);