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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Sun 17 February 2019 19:09

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

QGIS: Elimination de doublons dans une base de données

Bonjour à tous,

Dans une base de données que je créé peu à peu, je souhaiterais mettre à 'éliminé' un attribut textuel de ma base si pour la même valeur d'un autre attribut, cet attribut vaut une valeur déterminée.

Exemple : dans l'image jointe IMG1, je voudrais que MDApp prenne la valeur 'éliminé pour l'objet du haut puisqu'il a la même valeur d'attribut JoinVSDesigna que celui du bas.

En faite, il s'agit d'éliminer des doublons suite à une manipe d'appariement suivant un critère de distance.

Si quelqu'un peut me conseiller, je suis preneur.
Un grand merci d'avance.


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 Sun 17 February 2019 23:37

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Elimination de doublons dans une base de données

Si vous ne souhaitez que conserver une entité par couple de valeurs possibles MDApp/JoinVSDesigna, il est possible en SQL de faire :

Code:

Select Distinct MDApp, JoinVSDesigna from nom_couche

Si votre besoin est différent, alors ça pose des questions.

je voudrais que MDApp prenne la valeur 'éliminé pour l'objet du haut puisqu'il a la même valeur d'attribut JoinVSDesigna que celui du bas.


Si on suit uniquement cette logique, l'élément du bas prendrait aussi la valeur "éliminé" car son attribut JoinVSDesigna est aussi identique à celui du haut.Ça prendrait un critère supplémentaire pour filtrer ou plus d'info sur votre table pour avancer.

Hors ligne

 

#3 Mon 18 February 2019 10:38

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

Re: QGIS: Elimination de doublons dans une base de données

Bonjour,

Voici une solution que j'ai pu tester avec succès (cf image en PJ), si c'est bien ce que tu recherches

- Créer une colonne fid avec la valeur $id
- Créer un champ de type texte appelé statut et le mettre à jour avec cette expression dans le calculateur de champ :

Code:

case when count("join_VSDes","join_VSDes") > 1
then
    case when "fid" != maximum("fid", "join_VSDes")
    then 'éliminé'
    end
end

Cela mettra à "éliminé" la colonne statut pour toutes les lignes qui ont la même valeur join_VSDes, sauf la dernière

Code:

count("join_VSDes","join_VSDes")

compte le nombre d'éléments ayant la même valeur join_VSDes que la ligne courante. Le second argument est le group by

Code:

maximum("fid", "join_VSDes")

trouve dernier fid pour le groupe ayant la même valeur join_VSDes

Il aurait été plus joli d'utiliser concatenate avec un concatenator puis string_to_array, puis array_length, voire aussi array_last, mais j'ai remarqué que le concatenator ne marchait pas dans virtual field (chez moi en QGIS 3.4) https://issues.qgis.org/issues/21297


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

geodata au cerema et petits billets en géomatique

Hors ligne

 

#4 Mon 18 February 2019 19:37

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Elimination de doublons dans une base de données

Merci beaucoup Mathieu, on brule ...

Résultat dans l'image jointe, sauf que ... je voudrais que 'éliminé' n’apparaisse que pour les 2 valeurs de MDApp suivantes : 'App Geom 1m' ou 'App_Geom_2.5m' (et non pour les 2 autres valeurs que prend ce champ qui sont 'NULL' et 'Pas-Appariement').

Du coup, j'ai tenté (entre autres ...) le code qui est en dessous, mais, n'étant pas doué en programmation, ça me met NULL partout dans le champ STAT (que tu as appelé Statut).

Encore merci du petit réglage qui me permettrait d’arriver au résultat voulu.


case when count("join_VSDes","join_VSDes") > 1 AND  "MDApp"  ILIKE  'App Geom 1m' OR "MDApp"  ILIKE  'App_Geom_2.5m'
then
    case when "fid" != maximum("fid", "join_VSDes")
    then 'éliminé'
    end
end


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#5 Mon 18 February 2019 20:00

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Elimination de doublons dans une base de données

Et avec ceci ? :

Code:

case when count("join_VSDes","join_VSDes") > 1 AND ("MDApp"  =  'App Geom 1m' OR "MDApp"  =  'App_Geom_2.5m') 
then
    case when "fid" != maximum("fid", "join_VSDes")
    then 'éliminé'
    end
end

Dernière modification par carteq (Mon 18 February 2019 20:00)

Hors ligne

 

#6 Wed 20 February 2019 09:48

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Elimination de doublons dans une base de données

Merci Vincent, mais malheureusement non, j'ai toujours NULL partout dans le champ STAT.
A ce propos, quelle est la différence entre "ILIKE" et "=" pour une chaîne de caractère?

Hors ligne

 

#7 Wed 20 February 2019 21:09

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Elimination de doublons dans une base de données

A ce propos, quelle est la différence entre "ILIKE" et "=" pour une chaîne de caractère?


LIKE et ILIKE sont dédiés à comparer une valeur avec un pattern (patron). Si vous voulez savoir si 2 valeurs sont égales/identiques, c'est plus direct et plus rapide à exécuter en utilisant "=". ILIKE aurait fonctionné dans votre exemple cela dit.

Je vais jeter un oeil à votre problème dès que possible.

Hors ligne

 

#8 Thu 21 February 2019 22:27

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Elimination de doublons dans une base de données

J'ai réussi à faire exactement ce que vous voulez, en SQL, dans un autre logiciel. Je n'aurai pas le temps de porter ça vers QGIS avant la semaine prochaine. Alors voici de quoi inspirer MathieuR peut-être ou quelqu'un d'autre :

Update
(Select [a].[FID]  ,[a].[Stat] as [e]
from [Table] as [a], [Table] as [b] where ([a].[MDapp]+[a].[join_VSDes]) = ([b].[MDapp]+[b].[join_VSDes]) and [a].[FID] <> [b].[FID] and [a].[MDapp] <> "Pas App" and [a].[MDapp] <> ""
EXCEPT Select First([c].[FID]), First([c].[Stat])    from [Table] as [c], [Table] as [d] where ([c].[MDapp]+[c].[join_VSDes]) = ([d].[MDapp]+[d].[join_VSDes]) and [c].[FID] <> [d].[FID] and [c].[MDapp] <> "Pas App" and [c].[MDapp] <> "" Group BY [c].[join_VSDes], [c].[MDapp] )
Set [e] = "éliminé";


[j'ai ajouté un bout qui manquait pour exclure certaines valeurs. On pourrait remplacer <> "" par IS NOT NULL si les valeurs sont vraiment nulles]

Dernière modification par carteq (Thu 21 February 2019 22:46)

Hors ligne

 

#9 Mon 25 February 2019 18:34

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Elimination de doublons dans une base de données

Merci pour cette proposition, mais j'avoue avoir du mal en SQL.
En faite, dans l'image Image 1.jpg, l'attribut STAT ne devrait pas avoir la valeur éliminé car l'attribut Statut de la ligne du milieu est à "Non-App". Il devrait être à NULL.
En revanche, dans Image 2.jpg, c'est OK, l'attribut STAT prend à juste titre la valeur éliminé car l'attribut Statut de la ligne du milieu est à "App".
Vous voyez, c'est la valeur de l'attribut App d'un même join-VSDes qui décide.

Si vous avez une idée, je suis preneur.
Un grand merci d'avance.


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#10 Mon 25 February 2019 18:38

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Elimination de doublons dans une base de données

J'ai oublié la deuxième image


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#11 Mon 25 February 2019 18:41

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Elimination de doublons dans une base de données

je voulais dire, c'est la valeur de l'attribut Statut (et non App) d'un même join-VSDes qui décide.

Hors ligne

 

#12 Wed 27 February 2019 23:19

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Elimination de doublons dans une base de données

Avant que je ne poursuive la conversion vers QGIS, pouvez-vous me dire si la table dans le fichier joint comporte des résultats exacts ?

Merci.


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#13 Thu 28 February 2019 17:51

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Elimination de doublons dans une base de données

Bonjour et merci de vous pencher sur mon problème,

Ce n'est pas tout à fait exact.
Pour deux objets (ou plus) ayant le même join_VSDes, il faut éliminer (attribut STAT à éliminé) celui qui a le fid le plus petit et dont l'attribut statut de celui qui a le fid le plus grand est à App (et surtout pas Non-App).
Dans l'image jointe j'ai entouré en rouge le éliminé qui ne devrait pas apparaître.

En espérant que ces explications vous suffiront.

Encore un grand merci.


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#14 Fri 08 March 2019 00:25

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Elimination de doublons dans une base de données

Et comme ceci, c'est bon ?

Hors ligne

 

#15 Fri 08 March 2019 00:28

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Elimination de doublons dans une base de données

...impossible de modifier ses posts ou de joindre une fichier. La capture écran de mon résultat est ici :

https://drive.google.com/open?id=1JXJ6c … ZWsYK-EVgD

Hors ligne

 

#16 Sun 10 March 2019 17:19

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Elimination de doublons dans une base de données

Il semble que ça soit bon, surtout si vous avez réussi à enlever tous les "éliminé" de l'attribut STAT pour tous les objets dont l'attribut statut de celui qui a le fid le plus grand est à Non-App (cf. ce qui est entouré en rouge dans la pièce jointe de mon message du 28 février).

Merci beaucoup.

Hors ligne

 

#17 Thu 14 March 2019 20:59

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Elimination de doublons dans une base de données

Je crois que ça fonctionne !

SQL :

Code:

UPDATE 
     nom_de_la_couche
SET STAT  = 
CASE 
WHEN fid in (Select Distinct a.fid  from nom_de_la_couche as a, nom_de_la_couche as b 
where a.join_VSDes = b.join_VSDes
and a.fid <> b.fid 
and a.STATUT <> "App" and a.STATUT <> "" and a.STATUT IS NOT NULL 
and a.STATUT <> b.STATUT)

THEN "éliminé"
END

J'ai testé avec une table dans un geopackage, via le DB Manager (via la fenêtre SQL).

Hors ligne

 

#18 Fri 15 March 2019 18:03

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Elimination de doublons dans une base de données

Merci beaucoup.

J'ai copié votre code dans la calculatrice de champ (en insérant l'ID de la couche) pour mettre à jour le champ STAT, mais ça me renvoie une expression invalide. Il faut certainement faire d'autres modifications, mais je ne sais pas trop lesquelles.

Je pense qu'on brule smile

UPDATE      'BD_Ref_OK_c8f27ea9_38eb_428c_acac_091de29cc396'
SET STAT  =
CASE
WHEN fid in (Select Distinct a.fid  from 'BD_Ref_OK_c8f27ea9_38eb_428c_acac_091de29cc396' as a, 'BD_Ref_OK_c8f27ea9_38eb_428c_acac_091de29cc396'as b
where a.join_VSDes = b.join_VSDes
and a.fid <> b.fid
and a.STATUT <> "App" and a.STATUT <> "" and a.STATUT IS NOT NULL
and a.STATUT <> b.STATUT)

THEN "éliminé"
END

Hors ligne

 

#19 Mon 18 March 2019 22:55

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Elimination de doublons dans une base de données

Il ne faut pas confondre le SQL et la calculatrice de champs. La syntaxe est différente.

Pour votre cas, je crois que ceci fonctionnera via la calculatrice :

Code:

case when
 "Statut" <> '' and "Statut" IS NOT NULL 
 then

case when count("join_VSDes","join_VSDes") > 1

THEN
case when count_distinct("Statut", "join_VSDes") > 1 

THEN 
case when "Statut" <> 'App' 
then
 'éliminé'
    
end
end
end
end

Après chaque "Case", le nombre d'entités diminue et est filtré par le "Case" suivant. On applique "éliminé" sur les entités restantes au final.

Dernière modification par carteq (Mon 18 March 2019 22:57)

Hors ligne

 

#20 Sun 24 March 2019 19:51

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Elimination de doublons dans une base de données

Bonjour

Excusez le délai de ma réponse.
Votre code fonctionne sauf au cas où un nombre d'objets supérieur à 2 ont le même attribut Join_VSDes.
C'est le cas dans l'image ci-jointe, où seul l'objet qui a le fid le moins élevé doit être éliminé.
Encore merci.

Hors ligne

 

#21 Mon 25 March 2019 09:54

preliator
Participant assidu
Date d'inscription: 17 Nov 2018
Messages: 433

Re: QGIS: Elimination de doublons dans une base de données

Bonjour, j'ai du mal à comprendre votre code SQL. Sur quel logiciel programmez vous ?

Hors ligne

 

#22 Mon 25 March 2019 13:59

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Elimination de doublons dans une base de données

Sur le post #17, c'est dans QGIS.

Hors ligne

 

#23 Mon 25 March 2019 14:50

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Elimination de doublons dans une base de données

C'est le cas dans l'image ci-jointe, où seul l'objet qui a le fid le moins élevé doit être éliminé.


Pouvez-vous joindre l'image autrement que via le forum. Elle n'est pas visible. Merci !

Hors ligne

 

#24 Mon 25 March 2019 22:21

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Elimination de doublons dans une base de données

Je n'ai pas vu votre pièce jointe encore, mais on peut penser à ceci :

Code:

case when "Statut" <> '' and "Statut" IS NOT NULL then

              case when count("join_VSDes","join_VSDes") > 1 then

                    case when count_distinct("Statut", "join_VSDes") > 1 then

                           case when "Statut" <> 'App' then 

                                   case when "fid" = minimum("fid", "join_VSDes")     then  'éliminé'
    
                                   end
                           end
                    end
          end
end

Dernière modification par carteq (Mon 25 March 2019 22:25)

Hors ligne

 

#25 Wed 27 March 2019 10:38

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Elimination de doublons dans une base de données

C'est parfait ! J'ai parcouru toute la base, tous les fid mini sont éliminés.
Un très grand merci à vous.

Hors ligne

 

Pied de page des forums

Powered by FluxBB