Vous n'êtes pas identifié(e).
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
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)
Julien.
https://rjuju.github.io/
Hors ligne
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
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
Julien.
https://rjuju.github.io/
Hors ligne