Lister un historique en supprimant les doublons - SQL/NoSQL - Programmation
Marsh Posté le 02-06-2006 à 17:55:38
Comment veux tu que ça te retourne qqch que tu souhaite enlever de ta table... ?
Ou alors, j'ai pas compris...
Marsh Posté le 02-06-2006 à 19:08:30
une fois que j'aurai les lignes que je veux, je ferais le Delete.
tu n'as pas une idée sinon ..
Marsh Posté le 02-06-2006 à 19:15:57
Il y a peut être moyen en faisant une jointure entre la table et elle même. Du genre :
SELECT *
FROM la_table AS A, la_table AS B
WHERE A.col1=B.col1 AND A.col2=B.col2 AND A.col3=B.col3 AND B.la_date > A.la_date
Qui permet de trouver des lignes ayant les même 3 premières colonnes avec une date supérieure
Mais ca pose problème avec la ligne du 01/06
Marsh Posté le 02-06-2006 à 19:33:38
et oui, ça ne resoud pas mon problème mais c'est un début.
d'autres idées svp
Marsh Posté le 05-06-2006 à 06:10:40
kalex a raison, un group by devrait suffire :
select a, b, c, max(date)
from table
group by a, b, c
Marsh Posté le 05-06-2006 à 10:40:56
non. j'aurai pas eu besoin de poster si ce n'etait que ça.
Relisez bien le problème.
Marsh Posté le 05-06-2006 à 11:19:48
oui en effet j'avais mal lu.
regarde du cote des fonctions analytiques sous oracle, il y en a pas mal et ca devrait t'aider. j'ai pas la doc sous les yeux la mais je suis sur que tu dois pouvoir le faire avec.
Marsh Posté le 06-06-2006 à 10:54:12
Je veux bien quelques explications pour démarrer si tu en as (pour mon exemple)
Marsh Posté le 06-06-2006 à 13:44:48
je suis pas sur d'avoir tout saisi pour ce que tu veux faire en relisant l'enonce de ton probleme :
que veux tu garder comme ligne ? :
celles la ?
1 , 1 , 2 , 31/05/2006
1 , 1 , 1 , 01/06/2006
et dans le cas ou ta liste serait plus complique du style :
1 , 1 , 1 , 29/05/2006
1 , 1 , 1 , 30/05/2006
1 , 1 , 2 , 31/05/2006
1 , 1 , 1 , 01/06/2006
1 , 1 , 2 , 02/06/2006
1, 1 , 3 , 03/02/2006
1 , 1 , 1 , 04/06/2006
que faut il garder ?
Marsh Posté le 06-06-2006 à 15:11:26
si j'ai bien compris tous sauf 1 , 1 , 1 , 30/05/2006
en fait en résonnant par différence par rapport a la date précédente
on supprime toutes les instances dont la différence est égale à 0 :
1 , 1 , 1 , 29/05/2006 (+1)
1 , 1 , 1 , 30/05/2006 ( 0)
1 , 1 , 2 , 31/05/2006 (+1)
1 , 1 , 1 , 01/06/2006 (-1)
1 , 1 , 2 , 02/06/2006 (+1)
1, 1 , 3 , 03/02/2006 (+1)
1 , 1 , 1 , 04/06/2006 (-2)
Par contre je ne sais pas du tout comment construire une requete de ce type.
Marsh Posté le 07-06-2006 à 12:03:02
la fonction lag ou lead d'oracle doit pouvoir faire cela c'est a dire calculer cette difference pour chaque ligne.
il suffirait ensuite de virer les lignes dont la difference est nulle.
j'ai pas ma doc oracle donc je peux pas faire la requete, mais en cherchant un peu avec google, tu devrais trouver la syntaxe exacte.
Marsh Posté le 08-06-2006 à 19:50:15
J'ai trouvé un moyen en passant par du SQL simplement mais ton idée fifiz est vraiment bonne pour résoudre mon problème.
Que me conseillez-vous en terme de performances ?
Marsh Posté le 08-06-2006 à 20:20:37
besco a écrit : J'ai trouvé un moyen en passant par du SQL simplement mais ton idée fifiz est vraiment bonne pour résoudre mon problème. |
C'est quoi ta solution
(ca m'intéresse )
Marsh Posté le 09-06-2006 à 13:53:54
select * from table t1 where exists (select * from table t2 where t1.c1 = t2.c1 and t1.c2 = t2.c2 and t1.c3 = t2.c3 and abs(t1.date - t2.date) > 1 );
si j'ai tout comprsi je pense que cela devrait fonctionner à condition que tu aies toujours une valeur par jour dans ta table
Marsh Posté le 02-06-2006 à 17:47:50
Bonjour,
J'ai un souci pour traduire la reponse en SQL (je travaille avec Oracle 9i)
Voilà ma table:
1 , 1 , 1 , 29/05/2006
1 , 1 , 1 , 30/05/2006
1 , 1 , 2 , 31/05/2006
1 , 1 , 1 , 01/06/2006
Le resultat de ma requête doit me retourner la ligne 1 , 1 , 1 , 30/05/2006
Il s'agit en fait d'une table d'historisation. Je ne veux donc pas garder 1 , 1 , 1 , 30/05/2006 puisqu'il s'agit de la même ligne que la précèdente.
Par contre, je conserve toutes les autres lignes pour suivre qu'une colonne est passé à 2 le 31/05/2006 puis à 1 le 01/06/2006. C'est compris ?
Merci si vous avez une réponse, je me casse la tête depuis ce matin...
Message édité par besco le 03-06-2006 à 10:33:22