Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/10/2011, 12h29   #1
Invité de passage
 
Homme
Inscription : octobre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 3
Points : 1
Points : 1
Par défaut Sélection de l'état d'un processus par priorité

Bonjour à tous,

J'essaie désespérément de créer une requête mais je n'y arrive pas.

J'utilise une table (simplifiée) composée de 3 colonnes : PID, STATUS et TIMESTAMP. Cette table permet de suivre l'évolution d'un ensemble de processus identifiés par le champ PID. A chaque instant TIMESTAMP, un contrôle du statut (STATUS) d'un processus PID est effectué et tracé dans la table. A un instant donné, le statut d'un processus peut-être soit "OK", "ERROR" ou "WARNING".

J'essaie de créer une requête qui récupère, pour chaque PID, le dernier statut en date sachant que le statut "ERROR" est plus important que le statut "WARNING" qui est plus important que le statut "OK".

Par exemple, considérons la table suivante. Je veux que la requête retourne uniquement les valeurs en gras :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PID	STATUS	TIMESTAMP
1	OK	23/10/2010 12:50
1	WARNING	23/10/2010 12:51
1	OK	23/10/2010 12:52
2	OK	23/10/2010 12:53
2	WARNING	23/10/2010 12:54
2	ERROR	23/10/2010 12:55
2	WARNING	23/10/2010 12:56
3	ERROR	23/10/2010 12:57
3	WARNING	23/10/2010 12:58
3	OK	23/10/2010 12:59
3	ERROR	23/10/2010 13:00
4	OK	23/10/2010 13:01
4	OK	23/10/2010 13:02
5	WARNING	23/10/2010 13:03
5	ERROR	23/10/2010 13:04
5	WARNING	23/10/2010 13:05
6	ERROR	23/10/2010 13:06
6	OK	23/10/2010 13:07
6	OK	23/10/2010 13:08
7	WARNING	23/10/2010 13:09
7	WARNING	23/10/2010 13:10
Quelqu'un aurait-il une requête magique ?
J'espère avoir été clair. Merci d'avance pour votre aide !

-GreenLemon
GreenLemon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 13h33   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Que donne la requête suivante (non testée) ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT pid,
       max(STATUS) keep (dense_rank last ORDER BY trunc(TIMESTAMP) ,
                                                   case when STATUS = 'OK'      then 1
                                                        when STATUS = 'WARNING' then 2
                                                        when STATUS = 'ERROR'   then 3 
                                                    end , timestamp) AS STATUS,
       max(timestamp) keep (dense_rank last ORDER BY trunc(TIMESTAMP) ,
                                                   case when STATUS = 'OK'      then 1
                                                        when STATUS = 'WARNING' then 2
                                                        when STATUS = 'ERROR'   then 3 
                                                    end , timestamp) AS tstamp
  FROM latable
 GROUP BY pid
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 14h36   #3
Invité de passage
 
Homme
Inscription : octobre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 3
Points : 1
Points : 1
Bonjour skuatamad et merci beaucoup pour ta réponse ! Ca marche !!

Par contre, à quoi servent les clauses trunc(TIMESTAMP) puisque tu effectues déjà un tri de deuxième ordre sur timestamp ? J'obtiens le même résultat en les enlevant.

Merci encore.
GreenLemon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 15h14   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
le dernier statut en date
J'étais parti du principe qu'il y avait plusieurs dates (jours différents) par PID et qu'il fallait travailler avec la plus récente donc trunc(TIMESTAMP) pour ne travailler que sur la dernière date (sans les heures minutes secondes) et le dernier tri sur timestamp c'est pour gérer le cas :
Citation:
4 OK 23/10/2010 13:01
4 OK 23/10/2010 13:02
Où il faut prendre la plus récente.

Mais le tri sur trunc(TIMESTAMP) est peut être inutile.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 15h23   #5
Invité de passage
 
Homme
Inscription : octobre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 3
Points : 1
Points : 1
Pardon, je n'ai pas été clair. Par "dernier statut en date" je voulais simplement dire "statut le plus récent".
Donc si le statut d'un processus est "OK" à 13:00 et également "OK" à 14:00 je suis seulement intéressé par le deuxième.

Merci encore pour ton aide !
GreenLemon est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h18.


 
 
 
 
Partenaires

Hébergement Web