PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 15/05/2012 18:23:54

charleydc5
Membre

Supprimer des doublons dans une table (avec jointures)

Bonjour à tous,

Je fais face à un problème de doublons et j'aimerais avoir vos conseils à propos de cela.

Voici en premier lieu la structure des tables touchées par mon problème :
Table : cas
pk intcasid : integer

Table : intervention
pk intinterventionid : integer
fk intcasid : integer
strnom : character varying

Table : interventiontype
pk intinterventiontypeid : integer
strnom : character varying

Table : cheminement
pk intcheminementid : integer
fk intinterventionid : integer
fk intcheminementtypeid : integer
datcheminement : timestamp
inttemps : integer

Table : cheminementtype
pk intfiletypeid
strnom : character varying

En gros, un cas peut être vu comme un dossier sur lequel un employé travail. Dans le dossier, on y retrouve des interventions de divers types (conseils, encadrement, coaching, etc... Vous comprendrez donc que chaque intervention est reliée à un type). Dans chaque interventions, on des cheminements, autrement dit, des actions portées dans le cadre de l'intervention. Chaque cheminement est également relié à un type (suivi, séance d'information, formation, etc.). C'est au niveau du cheminement que l'employée saisit la date du cheminement ainsi que le temps passé pour l'ensemble du cheminement.

C'est ici que mon doublon se situe. J'aimerais être capable de supprimer les cheminements qui sont pour la même date avec le même temps, pour n'en conserver qu'un seul (peu importe, le MIN ou le MAX intcheminementid).

Voici un exemple de doublon qui rèflète bien ma situation :

intcasid; intervention.strnom; cheminementtype.strnom; datcheminement; inttemps; nombre d'occurences
3194;         "Coaching";          "Séance";          "2011-10-27";          180;          23
3194;         "Coaching";          "Séance";          "2011-10-17";          150;          119
3194;         "Coaching";          "Séance";          "2011-10-25";          180;          55
3194;          "Coaching";          "Séance";          "2011-11-07";          75;           7

La requête qui donne ce résultat :

    SELECT cas.intcasid, intervention.strnom, cheminementtype.strnom, datcheminement, inttemps, COUNT(*)
    FROM cas 

    INNER JOIN intervention ON
    cas.intcasid = intervention.intcasid 

    INNER JOIN interventiontype ON
    intervention.intactivitenomid = interventiontype.intinterventiontypeid

    INNER JOIN cheminement ON
    intervention.intinterventionid = cheminement.intinterventionid
 
    INNER JOIN cheminementtype ON
    cheminement.intcheminementtypeid = cheminementtype.intcheminementtypeid 

    WHERE cas.intcasid = 3194
    
    GROUP BY cas.intcasid, interventiontype.strnom, cheminementtype.strnom, datcheminement, inttemps
    HAVING count(*) > 1;

J'aimerais donc vous lire par rapport à cela, à savoir s'il existe une façon éprouvée dans PostgreSQL pour supprimer le tout proprement. La façon dont je pensais procéder est avec une table temporaire, mais ce n'est pas la plus facile à concevoir et la plus efficace pour un grand ensemble de données.

Je vous remercie à l'avance pour votre aide habituelle.

Bonne journée à tous

Charles

Dernière modification par charleydc5 (15/05/2012 18:26:00)


Charles Morin
PostgreSQL 9.0.3 sur Windows 2008 Server Standard (x64)

Hors ligne

#2 15/05/2012 22:01:27

rjuju
Administrateur

Re : Supprimer des doublons dans une table (avec jointures)

Bonjour.
Si ces données sont présentes et ne doivent pas l'être, il faudrait corriger le problème lors de la saisie des données, sinon la suppression corrigera le problème mais il reviendra.
Sinon, un moyen simple d'éliminer les doublons est d'utiliser la fonction window row_number().
Par exemple, pour trouver toutes les lignes en doublon sur votre table, il faudrait faire quelque chose comme :

SELECT intcheminementid, num FROM (
SELECT intcheminementid, row_number() OVER (PARTITION BY intinterventionid,intcheminementtypeid,datecheminement) AS num
FROM cheminement
)src
WHERE num > 1

Pour avoir les identifiants des lignes en doublon. Il suffit ensuite de supprimer ces lignes.
Précision : je n'ai pas testé la requête, et il faudra peut-être la modifier (au niveau du partition by) selon vos critères de doublon.

Dernière modification par rjuju (15/05/2012 22:01:56)

Hors ligne

#3 16/05/2012 13:02:42

charleydc5
Membre

Re : Supprimer des doublons dans une table (avec jointures)

Si je comprends bien, le PARTITION BY est similaire à un GROUP BY?

Merci beaucoup et bonne journée


Charles Morin
PostgreSQL 9.0.3 sur Windows 2008 Server Standard (x64)

Hors ligne

#4 16/05/2012 13:11:17

rjuju
Administrateur

Re : Supprimer des doublons dans une table (avec jointures)

En gros oui, sauf que l’agrégation se fait indépendamment pour chaque ligne et non globalement.
Pour plus de détails vous pouvez voir la doc : http://docs.postgresqlfr.org/9.0/tutorial-window.html

Hors ligne

Pied de page des forums