Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Tue 19 March 2024 15:38

Alice.C
Participant occasionnel
Date d'inscription: 24 Sep 2015
Messages: 15

PGSQL - Supprimer doublons d'une table

Bonjour,

J'ai une table géométrique avec des doublons. Je souhaiterais par une requête sql supprimer ces doublons, soit en fusionnant les entités soit en ne conservant qu'une ligne parmi les entités dupliquées.

Je pourrais recréer une nouvelle table à partir de la précédente, avec un GROUP BY. Mais j'ai une condition, si cela est possible, j'aimerais ne pas avoir à citer les noms de champs dans ma requête. Car je dois dupliquer cette requête à une cinquante de tables et ces tables sont susceptibles d'évoluer donc j'aimerais éviter une vérification des champs dans ma requête à chaque mise à jour de données.

Je suis donc plutôt partie sur l'idée d'un DELETE FROM mais je suis bloquée. Voici la requête.

Code:

DELETE FROM sup.sup_t1_ass_s_gpu_test
WHERE "IDE" IN (
    SELECT "IDE" FROM ref_gpu_sup_flux_tdlu.sup_t1_ass_s_gpu
    GROUP BY id,geom
    HAVING count(id)>1);

Cette requête fonctionne, dans le sens où elle supprime effectivement les doublons. Sauf qu'elle supprime toutes les versions de l'entité dupliquée.

Quelqu'un aurait il une piste ?

Bonne journée,

Hors ligne

 

#2 Tue 19 March 2024 16:45

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: PGSQL - Supprimer doublons d'une table

Bonjour,

Il y a bcp de façons de faire pour supprimer les doublons.
Perso je passe par des tableaux (array) stockant les identifiants des geom identiques,
puis je delete depuis la table tous les identifiants qui sont dans le tableau sauf 1 (le premier par ex)
Avec des array, c'est facile de selectionner une sous partie du tableau, par ex tous les élements sauf le premier:

Code:

arr[2:array_length(arr, 1)]

Par ex:
On peut choisir l'ordre des ids dans le tableau si on veut, pour garder celui qu'on veut parmi les doublons, en faisant: array_agg(id order by ...) as ids

Code:

with tmp as (
    select array_agg(id) as ids
    FROM ref_gpu_sup_flux_tdlu.sup_t1_ass_s_gpu
    group by geom 
    having count(*) > 1
)
delete from ref_gpu_sup_flux_tdlu.sup_t1_ass_s_gpu s 
using tmp t 
where s.id = any(t.ids[2:array_length(t.ids, 1)]);

Nicolas

Hors ligne

 

#3 Tue 19 March 2024 17:06

Alice.C
Participant occasionnel
Date d'inscription: 24 Sep 2015
Messages: 15

Re: PGSQL - Supprimer doublons d'une table

Bonjour Nicolas,

Merci beaucoup pour la réponse, je viens de tester c'est parfait.


Je ne connaissais pas les tableaux, ils seront utiles pour améliorer mes requêtes.

Bonne fin de journée,

Hors ligne

 

Pied de page des forums

Powered by FluxBB