#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.
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
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
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
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.
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.
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.
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
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