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 :

Extraire le dernier enregistrement pour chaque valeur d'une colonne


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut Extraire le dernier enregistrement pour chaque valeur d'une colonne
    Bonjour,

    j'ai une table de cette forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    PERFID	PJDATR	        PEMATI	PEQUAL	PEPREN	                PENOMF
    3594241	20181208	49366	Mr.	Anthony             	DUPONT
    3594242	20181209	49366	Mr.	Anthony             	DUPONT
    3748996	20200108	49366	Mr.	Anthony             	DUPONT
    3721911	20191109	49366	Mr.	Anthony             	DUPONT
    3594056	20181206	49366	Mr.	Anthony             	DUPONT
    3572987	20181011	49366	Mr.	Anthony             	DUPONT
    3749000	20200108	49366	Mr.	Anthony             	DUPONT
    3570354	20181003	49366	Mr.	Anthony             	DUPONT
    3594066	20181207	49366	Mr.	Anthony             	DUPONT
    3571634	20181006	49366	Mr.	Anthony             	DUPONT
    3740824	20191217	49366	Mr.	Anthony             	DUPONT
    J'ai mis un exemple que pour une personne.

    Je voudrai extraire de cette table exemple le dernier enregistrement qui est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PERFID	PJDATR	        PEMATI	PEQUAL	PEPREN	                PENOMF
    3749000	20200108	49366	Mr.	Anthony             	DUPONT
    j'ai fait cette requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from sasnivaeai.fperjoeai as f1
    where  f1.PJDATR in(select max(f.PJDATR) from sasnivaeai.fperjoeai as f where f.PEMATI=f1.PEMATI)) 
    order by  f1.PJDATR
    elle marche mais me donne le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PERFID	PJDATR	        PEMATI	PEQUAL	PEPREN	                PENOMF
    3748996	20200108	49366	Mr.	Anthony             	DUPONT
    3749000	20200108	49366	Mr.	Anthony             	DUPONT
    J'ai une ligne de trop
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PERFID	PJDATR	        PEMATI	PEQUAL	PEPREN	                PENOMF
    3749000	20200108	49366	Mr.	Anthony             	DUPONT
    il me faut aussi faire un max() sur ma colonne PERFID.
    Mais je n'y arrive pas

    Est-ce que quelqu'un aurait une solution svp.

    Merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Regardez du côté des fonctions d'agrégat FIRST / LAST :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      select max(PERFID) keep(dense_rank first order by PJDATR desc, PERFID desc) as PERFID
           , max(PJDATR)                                                          as PJDATR
           , PEMATI
           , max(PEQUAL) keep(dense_rank first order by PJDATR desc, PERFID desc) as PEQUAL
           , max(PEPREN) keep(dense_rank first order by PJDATR desc, PERFID desc) as PEPREN
           , max(PENOMF) keep(dense_rank first order by PJDATR desc, PERFID desc) as PENOMF
        from sasnivaeai.fperjoeai
    group by PEMATI;

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 137
    Points : 1 917
    Points
    1 917
    Par défaut
    Bonjour,

    Si tu es en 12c au moins, tu peux utiliser une requête match_recognize:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select * 
    from sasnivaeai.fperjoeai
    match_recognize  
     (partition by pemati
      order by pjdatr 
      measures max(ligne.perfid) as perfid, 
               ligne.pjdatr as pjdatr,
               pequal as pequal,
               pepren as pepren,
               penomf as penomf 
      pattern (ligne+) 
      define ligne as ligne.pjdatr = max(ligne.pjdatr)  
     );

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Consultant MOE-MOA Finance
    Inscrit en
    Novembre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE-MOA Finance
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2019
    Messages : 17
    Points : 36
    Points
    36
    Par défaut
    Bonjour
    Si vous cherchez la ligne avec le dernier PERFID, cette requête devrait répondre à votre attente. Dites moi si j'ai mal compris votre demande.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from sasnivaeai.fperjoeai 
    where   PERFID = (select max(PERFID) from sasnivaeai.fperjoeai );

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/05/2018, 19h35
  2. [MySQL] Créer une section pour chaque valeur d'une colonne
    Par helrick dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 14/08/2013, 00h23
  3. [MySQL] extraire un seul enregistrement pour chaque eleve
    Par Amel_B dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 19/09/2011, 12h15
  4. Réponses: 13
    Dernier message: 11/02/2011, 17h38
  5. [MySQL] Créer un enregistrement pour chaque ligne d'une zone de texte
    Par JackBeauregard dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 13/09/2009, 20h14

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