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 13/04/2011, 18h54   #1
Invité régulier
 
Inscription : décembre 2007
Messages : 30
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 30
Points : 5
Points : 5
Par défaut Selection max du dernier enregistrement

Bonjour
Je souhaite sélectionner le dernier enregistrement et dans le cas ou ce dernier pour un ID prof est égale à "prepa" je sélectionne la valeur qui précède.

Ex:
ID Prof Classe Date
Prof1 Seconde 01/09/2009
Prof1 Premiere 01/09/2010
Prof1 Bac 01/01/2011
Prof1 Prepa 01/02/2011

résultat: Prof Bac 01/01/2011
spopo69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 21h55   #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
Regarde le tutoriel sur les fonctions analytiques
Code :
1
2
3
4
5
6
7
8
9
10
SELECT id_prof,
       case when classe = 'Prepa' then prev_dte else dte end AS dte,
       case when classe = 'Prepa' then prev_classe else classe end AS classe
  FROM (SELECT id_prof,dte,classe,
               row_number() over (partition BY id_prof ORDER BY dte DESC) AS rn,
               lead(classe) over (partition BY id_prof ORDER BY dte DESC) AS prev_classe,
               lead(dte) over (partition BY id_prof ORDER BY dte DESC) AS prev_dte
          FROM t
       )
 WHERE rn = 1
Si j'ai bien compris, un prof2 qui n'a pas Prepa en derniere date doit renvoyer la dernière classe.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 09h41   #3
Membre expérimenté
 
François
Inscription : février 2010
Messages : 305
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 305
Points : 535
Points : 535
C'est pas un select where classe<>prepa ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
WITH DATA AS
 (SELECT 1 ID, 'prof1' PROF, 'seconde' CLASSE, TO_DATE('01-Sep-2009') DATE1
    FROM DUAL
  UNION
  SELECT 2, 'prof1', 'premiere', TO_DATE('01-oct-2010')
    FROM DUAL
  UNION
  SELECT 3, 'prof1', 'bac', TO_DATE('01-Jan-2011')
    FROM DUAL
  UNION
  SELECT 4, 'prof1', 'prepa', TO_DATE('01-Feb-2011') FROM DUAL)
SELECT *
  FROM (SELECT * FROM DATA WHERE CLASSE <> 'prepa' ORDER BY DATE1 DESC)
 WHERE ROWNUM = 1;
D'ailleurs, je pensais qu'il faisait les order by avant de renvoyer la reponse, mais non.
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/04/2011, 09h52   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Attention aux to_date sans format, l'intérêt de mettre les données dans le WITH pour simuler un jeu de test permet à tout le monde de faire un copier / coller / exécuter, mais là comme je n'ai pas le même nls_date_format que vous, ça ne fonctionne pas !

En utilisant la fonction FIRST :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
WITH mydata AS
(
SELECT 1 AS id, 'prof1' AS prof, 'seconde' AS classe, date '2009-09-01' AS dt FROM dual union ALL
SELECT 2      , 'prof1'        , 'premiere'         , date '2010-10-01'       FROM dual union ALL
SELECT 3      , 'prof1'        , 'bac'              , date '2011-01-01'       FROM dual union ALL
SELECT 4      , 'prof1'        , 'prepa'            , date '2011-02-01'       FROM dual
)
  SELECT prof,
         max(classe) keep(dense_rank first ORDER BY dt DESC) AS classe, 
         max(dt) AS dt
    FROM mydata
   WHERE classe <> 'prepa'
GROUP BY prof;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 14/04/2011, 10h18   #5
Membre expérimenté
 
François
Inscription : février 2010
Messages : 305
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 305
Points : 535
Points : 535
C'est vrai
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 10h23   #6
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
Avec rownum ça ne fonctionne pas, on perd le par prof, mais effectivement il faut filtrer sur <>'Prepa'...
La solution avec le first étant sûrement la plus performante.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 22h37   #7
Invité régulier
 
Inscription : décembre 2007
Messages : 30
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 30
Points : 5
Points : 5
Citation:
Envoyé par skuatamad Voir le message
Avec rownum ça ne fonctionne pas, on perd le par prof, mais effectivement il faut filtrer sur <>'Prepa'...
La solution avec le first étant sûrement la plus performante.
Merci bcp pour votre aide
je vous souhaite un bon weekend
spopo69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 22h56   #8
Invité régulier
 
Inscription : décembre 2007
Messages : 30
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 30
Points : 5
Points : 5
Citation:
Envoyé par skuatamad Voir le message
Regarde le tutoriel sur les fonctions analytiques
Code :
1
2
3
4
5
6
7
8
9
10
SELECT id_prof,
       case when classe = 'Prepa' then prev_dte else dte end AS dte,
       case when classe = 'Prepa' then prev_classe else classe end AS classe
  FROM (SELECT id_prof,dte,classe,
               row_number() over (partition BY id_prof ORDER BY dte DESC) AS rn,
               lead(classe) over (partition BY id_prof ORDER BY dte DESC) AS prev_classe,
               lead(dte) over (partition BY id_prof ORDER BY dte DESC) AS prev_dte
          FROM t
       )
 WHERE rn = 1
Si j'ai bien compris, un prof2 qui n'a pas Prepa en derniere date doit renvoyer la dernière classe.
Dans cette table, un prof doit dans tous les cas avoir une classe "prépa"
Le but c'est de récupérer la dernière classe juste avant l'affectation de la classe prepa
spopo69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 00h20   #9
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
Utilise le code proposé par Waldar et dis nous si ça convient, et d'après tes specs ça convient.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h38.


 
 
 
 
Partenaires

Hébergement Web