IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Selection max du dernier enregistrement


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    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

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Regarde le tutoriel sur les fonctions analytiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    C'est pas un select where classe<>prepa ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    C'est vrai

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    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.

  7. #7
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Regarde le tutoriel sur les fonctions analytiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Utilise le code proposé par Waldar et dis nous si ça convient, et d'après tes specs ça convient.

Discussions similaires

  1. Selection max du dernier enregistrement
    Par spopo69 dans le forum Développement
    Réponses: 5
    Dernier message: 19/04/2011, 22h37
  2. select le dernier enregistrement
    Par yasmine* dans le forum Requêtes
    Réponses: 1
    Dernier message: 28/02/2007, 20h32
  3. Instruction SELECT a partir du dernier enregistrement
    Par Bandzaille dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 27/09/2006, 11h41
  4. [debutant] selection des 6 derniers enregistrements
    Par LoLoSS dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/07/2004, 15h27
  5. Réponses: 10
    Dernier message: 01/08/2003, 13h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo