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

Langage SQL Discussion :

Selection avec date la plus récente


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Selection avec date la plus récente
    Bonjour,

    voici un cas dans lequel je n'arrive pas à formuler correctement ma requête :

    J'ai une table identité avec nom, prénom... et matricule.
    Et une table situation avec matricule, grade, echelon... datevenement.

    Dans cette table situation, on retrouve plusieurs lignes avec le même numéro de matricule et des informations liées aux changmeent de situation. Par exemple :

    Matricule Grade echelon Datevenement
    12 B 5 2004/05/08
    12 B 6 2006/06/06
    12 B 7 2008/08/08
    12 A 8 2010/10/10
    ...
    13 C 3 2000/01/01
    13 C 4 2002/04/04
    13 C 5 2010/05/05
    ...
    ...
    Et ainsi de suite.


    Je voudrais récupérer la ligne correspondant à la datevenement la plus récente pour chaque matricule.
    Donc dans mon exemple, je voudrais le résultat :

    12 A 8 2010/10/10
    13 C 5 2010/05/05


    J'ai bien tenté une requête juste pour le matricule 12 qui ressemble à ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select *
      from situation
     where datevenement = (select max(datevenement)
                             from situation
                            where matricule = 12)
       and matri = 12;
    En réponse j'ai bien :
    12 A 8 2010/10/10

    Pourtant je n'arrive pas à l'adapter pour qu'elle retourne la ligne correspondant à la datevenement la plus récente pour chaque matricule.

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    sgbd ?

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    C'est une question qui revient tellement souvent...

    Une petite recherche t'aurait permis de trouver la plus récente : Select derniere date
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    C'est une base Oracle.

    En effet ce topic à l'air de pouvoir répondre à ma question, je vais essayer, merci.

    PS : c'est pas gagné, plusieurs solutions différentes, laquelle est la plus "propre" et simple ?

    Transposé ca donne ca ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT  *
    FROM    Situation
    WHERE   EXISTS
            (   SELECT  *
                FROM    Situation
                WHERE   Situation.matricule = Situation.matricule
                HAVING  MAX(situation.datevenement) = Situation.datevenement
            )

  5. #5
    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
    Si vous êtes au moins en 9i :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with sr as
    (
    select Matricule, Grade, echelon, Datevenement,
           row_number() over(partition by Matricule order by Datevenement desc) as rn
      from situation
    )
    select Matricule, Grade, echelon, Datevenement
      from sr
     where rn = 1;

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci pour cette réponse.
    Je suis novice en SQL.

    J'ai essayé de la comprendre, et j'en conclue que 'sr' est une sorte de variable qui contient une requête SQL.
    Et la dernière requête effectue un select from 'sr' qui permet de trier cette sous requete contenue dans une variable sr ?

    Le souci est que je voudrais executer tout ce code dans un interpréteur sql (j'utilise Talend) mais il ne reconnait pas cette déclaration (sr).

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Aucun éditeur graphique ne peut permettre de faire des requêtes SQL avec toute la syntaxe SQL. D'où le nivellement par le bas des connaissance en SQL !
    Evitez d'utiliser un tel outil, ou bien condamnez-vous à ne faire que de pauvres requête pour solutionner qu'une partie de vos besoins....
    Pour ce qui est des CTE : http://sqlpro.developpez.com/cours/s...te-recursives/
    Pour ce qui est des fonctions de fenêtrage : http://sqlpro.developpez.com/article...clause-window/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Je comprends a peu près le principe grâce aux lien donnés mais est ce la seule et unique solution pour une requête en apparence si simple ? (mais très complexe a mettre en code apparemment).

    L'utilisation de Talend m'est imposée et il s'agit de créer une interface entre 2 bases de données différentes avec extraction et traitement des données.

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Non ca n'est pas la seule solution, par contre sans utilisation des fonctions de fenêtrage la requêtes devient beaucoup plus complexe.

    Y a 3 ou 4 poste sur cette page qui traitent de ce sujet.

  10. #10
    Membre actif Avatar de sofiane_bfm007
    Profil pro
    Consultant Décisionnel
    Inscrit en
    Mai 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Décisionnel

    Informations forums :
    Inscription : Mai 2008
    Messages : 261
    Points : 242
    Points
    242
    Par défaut
    moi je suis sur sql server, et un truc de ce gens ça va le faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT	s.matricule,
    	s.Datevenement,
    	s.Grade,
                 s.echelon 
     
    FROM    situation s,
    (SELECT   matricule,
    	   max(Datevenement) as MAX_DATE
     
    FROM   situation
     
    group by
    matricule ) SMAX
    where s.matricule= SMAX.matricule
    and  s.Datevenement=SMAX.MAX_DATE
    Business Intelligence : Talend, Cognos 8, SAS 9.2, ODI

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si j'ai bien compris la demande, cette requête doit fonctionner non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT s.Matricule, s.Grade, s.echelon, s.Datevenement
    FROM situation AS s
    INNER JOIN (
        SELECT Matricule, MAX(Datevenement) AS Datemax
        FROM situation
        GROUP BY Matricule
    ) tmp ON tmp.Matricule = s.Matricule
    WHERE s.Datevenement = tmp.Datemax
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  12. #12
    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
    Au pire vous pouvez toujours créer une vue sur votre base de données et interroger cette dernière avec Talend.

    Mais attention à la façon dont vous voulez utiliser votre ETL et à l'endroit où vous voulez centraliser la connaissances et les règles métiers.

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci, les requêtes ne passent pas correctement dans TAlend mais vos réponses me donnent maintenant l'architecture correcte de la requête que je recherche.

  14. #14
    Membre actif Avatar de sofiane_bfm007
    Profil pro
    Consultant Décisionnel
    Inscrit en
    Mai 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Décisionnel

    Informations forums :
    Inscription : Mai 2008
    Messages : 261
    Points : 242
    Points
    242
    Par défaut
    Désolé mais cette requête marche très bien pour moi, avec une base MySql et Talend comme ETL et aussi avec Sql Server et Cognos DataManager 8.4 comme ETL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT	s.matricule,
    	s.Datevenement,
    	s.Grade,
                 s.echelon 
     
    FROM    situation s,
    (SELECT   matricule,
    	   max(Datevenement) AS MAX_DATE
     
    FROM   situation
     
    GROUP BY
    matricule ) SMAX
    WHERE s.matricule= SMAX.matricule
    AND  s.Datevenement=SMAX.MAX_DATE
    Tu trouvera ci-joint des captures d'écrans
    Fichiers attachés Fichiers attachés
    • Type de fichier : rar Job.rar (65,5 Ko, 222 affichages)
    Business Intelligence : Talend, Cognos 8, SAS 9.2, ODI

  15. #15
    Membre actif Avatar de sofiane_bfm007
    Profil pro
    Consultant Décisionnel
    Inscrit en
    Mai 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Décisionnel

    Informations forums :
    Inscription : Mai 2008
    Messages : 261
    Points : 242
    Points
    242
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Si j'ai bien compris la demande, cette requête doit fonctionner non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT s.Matricule, s.Grade, s.echelon, s.Datevenement
    FROM situation AS s
    INNER JOIN (
        SELECT Matricule, MAX(Datevenement) AS Datemax
        FROM situation
        GROUP BY Matricule
    ) tmp ON tmp.Matricule = s.Matricule
    WHERE s.Datevenement = tmp.Datemax
    Je confirme que ça marche très bien !!!!! pour moi
    Business Intelligence : Talend, Cognos 8, SAS 9.2, ODI

  16. #16
    Membre actif Avatar de sofiane_bfm007
    Profil pro
    Consultant Décisionnel
    Inscrit en
    Mai 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Décisionnel

    Informations forums :
    Inscription : Mai 2008
    Messages : 261
    Points : 242
    Points
    242
    Par défaut
    Citation Envoyé par chmdev Voir le message
    Merci, les requêtes ne passent pas correctement dans TAlend mais vos réponses me donnent maintenant l'architecture correcte de la requête que je recherche.
    Essai de respecter l'ordre de colonne qui est dans la requête et celui qui est dans ton schéma de ton input
    Business Intelligence : Talend, Cognos 8, SAS 9.2, ODI

  17. #17
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour tes tests, nous avons un intervenant Talend qui vient demain et tes imprim ecran vont beaucoup nous servir.
    Tout devient plus clair.
    Merci encore !

  18. #18
    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
    J'espère qu'il ne vient pas que pour ce problème car vous avez plusieurs solutions dans ce sujet.

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/10/2014, 22h29
  2. Trouver les enregistrements avec les dates les plus récentes
    Par fullmetalalchemiste dans le forum Requêtes
    Réponses: 4
    Dernier message: 17/05/2012, 10h05
  3. Réponses: 10
    Dernier message: 22/07/2010, 10h20
  4. Réponses: 8
    Dernier message: 12/11/2008, 17h07
  5. Select la date la plus récente
    Par NicoNGRI dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/09/2005, 16h45

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