Lister un historique en supprimant les doublons

Lister un historique en supprimant les doublons - SQL/NoSQL - Programmation

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
Reply

Marsh Posté le 02-06-2006 à 17:47:50   

Reply

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

Reply

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

Reply

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 [:figti]  
Mais ca pose problème avec la ligne du 01/06 :pt1cable:

Reply

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

Reply

Marsh Posté le 05-06-2006 à 00:18:22    

Un simple GROUP BY .., .., ...  ne ferait pas l'affaire ?

Reply

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

Reply

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.

Reply

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.

Reply

Marsh Posté le 06-06-2006 à 10:54:12    

Je veux bien quelques explications pour démarrer si tu en as (pour mon exemple)

Reply

Marsh Posté le 06-06-2006 à 10:54:12   

Reply

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 ?
 
 
 
 
 
 

Reply

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.

Reply

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.

Reply

Marsh Posté le 07-06-2006 à 12:17:59    

Reply

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 ?

Reply

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.
 
Que me conseillez-vous en terme de performances ?

C'est quoi ta solution :??:  
(ca m'intéresse :) )

Reply

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed