Aide pour une requête de maintenance

Aide pour une requête de maintenance - SQL/NoSQL - Programmation

Marsh Posté le 18-08-2008 à 14:15:05    

Bonjour,
 
je suis loin d'être un expert SQL et j'ai un problème au travail et j'ai besoin d'effectuer une requête complexe.
 
La Table en tres gros résumé...
-------------------
ID  | timestamp | valeur   | Description
1   | timestamp | 1         | Blah
2   | timestamp | 1         | Blah
3   | timestamp | 1         | Blah
4   | timestamp | 2         | Blah
5   | timestamp | 3         | Blah
6   | timestamp | 3         | Blah
7   | timestamp | 4         | Blah
8   | timestamp | 4         | Blah
9   | timestamp | 4         | Blah
10   | timestamp | 4         | Blah
11   | timestamp | 4         | Blah
12   | timestamp | 4         | Blah
 
 
Je dois parvenir a limiter la table a un maximum.
Je veux creer une procédure (Delete statement) qui me permettrait de faire la maintenance en me basant sur le champ Valeur (Max 2 2ID ayant cette valeur).
 
Dans l'exemple du haut il y a 3 entré avec la valeur 1 et 6 entré avec la valeur 4. Je devrais donc effacer les plus vieille affin de garder seulement 2 ID ayant la valeur 2.
 
La ou sa se complexifie s'est que je ne peux pas spécifier la database que j'utilise.  
Elle suporte le Limit, mais pas dans une requête imbriqué. ex.: (delete from table where not exist(select * from blah Limit 5))
 
Alors si quelqu'un pourrait m'aider a développer une procédure qui clean a la demande ou un trigger qui est fait avant chaque insert se serait très apprécié.
 
Merci

Reply

Marsh Posté le 18-08-2008 à 14:15:05   

Reply

Marsh Posté le 18-08-2008 à 14:20:21    

Hmm... elle est zarb ta table. Ta clef c'est l'id ou la valeur ? [:opus dei]

 

Et sinon, pourquoi tout simplement ne pas te baser sur le timestamp ? S'il est trop vieux => poubelle. Ou archivage.
Ceci dit, la plupart des SGBD savent gérer plusieurs millions de lignes sans sourciller, hein.


Message édité par Elmoricq le 18-08-2008 à 14:21:08
Reply

Marsh Posté le 18-08-2008 à 14:55:52    

Ma clef s'est l'ID. mais oui je veux limiter selon le nombre de records ayant la même valeur. Et non, j'ai vraiment une limite de taille/performance.
(en 20 seconde je parviens a remplir mon stockage Max.)
 
Je ne peut pas me baser seulement sur le Timestamp, car je doit garder au minimum les 2 plus récents de chaque Valeur.

Reply

Marsh Posté le 18-08-2008 à 16:23:39    

Essayer la requête suivante (je l'ai testée sous Oracle).

Delete from table t1
where t1.timestamp <
 (select max(t2.timestamp) from table t2
   where t2.valeur = t1.valeur
     and t2.timestamp <  
   (select max(t3.timestamp) from table t3
     where t3.valeur = t2.valeur)
 )

Reply

Marsh Posté le 18-08-2008 à 17:31:25    

ça risque pas de lui pêter à la gueule s'il dit qu'il a plusieurs autant de records?
ça va pas faire une floppée de full table?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 18-08-2008 à 18:00:37    

Il n'y a pas de risque si l'on maitrise la situation.
La requête est relativement simple puisqu'elle n'a que huit lignes.
Elle prend tous les enregistrements sauf ceux du dernier et de l'avant dernier timestamp pour chaque valeur. Comme elle n'utilise pas "limit", elle me parait avoir un peu plus de chances d'être portable sur divers bases de données, que l'essai précédent.
 
Avant de mettre en place une requête delete, il est bien évidemment conseillé de la tester d'abord avec select.
C'est ce que j'ai fait, et cela marche bien avec ma base et mon environnement.

Reply

Sujets relatifs:

Leave a Replay

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