La requête que vous recherchez est :
select distinct on (my_unique_1, my_unique_2) * from my_table;
Cela permet de sélectionner une ligne pour chaque combinaison de colonnes dans la base de données. distinct on
. En fait, c'est toujours le premier rang. C'est rarement utilisé sans order by
car il n'y a pas d'ordre fiable dans lequel les lignes sont retournées (et donc laquelle est la première).
Combiné avec order by
vous pouvez choisir quelles lignes sont les premières (cela laisse les lignes avec la plus grande 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;
Maintenant vous pouvez sélectionner ceci dans une nouvelle table :
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;
Ou vous pouvez l'utiliser pour supprimer, en supposant que row_id
est une clé primaire :
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);