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 :

requete avec Max(Date)


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut requete avec Max(Date)
    Bonjour,

    Il y a beaucoup de sujets similaires à ma demande, mais je n'ai pas trouvé ma réponse . J'ai une table de 3 champs.

    NOM|TYPE DE MODIF| DATE

    exemple :

    PIERRE | C | 01/01/09
    PIERRE | C | 02/01/09
    JACQUES| C | 02/01/09
    PIERRE | M | 03/01/09

    Le résultat que Je dois trouver est : Par personne le type de modification la plus ressente avec sa date de mise à jour. Soit :

    JACQUES| C | 02/01/09
    PIERRE | M | 03/01/09

    Or lorsque j'exécute ma requête, cela me donne :

    PIERRE | C | 02/01/09
    JACQUES| C | 02/01/09
    PIERRE | M | 03/01/09

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select max(date), type, nom
    from table
    group by type, nom
    Pourriez vous s'il vous plait m'aider ?

    Merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    C'est pourtant effectivement un problème classique maintes fois évoqué et solutionné sur ce forum. Tu n'as pas dû chercher beaucoup.

    Quand un problème est complexe, on le décompose en sous-problèmes. Je crois qu'un certain Descartes a écrit quelque chose dans le genre il y a plusieurs siècles...

    Par personne le type de modification la plus ressente avec sa date de mise à jour.
    Nous avons donc besoin de connaître d'abord pour chaque personne la date la plus récente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom, MAX(ladate) AS ladatemax
    FROM latable
    GROUP BY nom
    Ensuite nous récupérons l'info que nous cherchons pour cette date max de chaque personne grâce à une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT t.nom, t.TypeModif, t.ladate AS DerniereDate
    FROM latable t
    INNER JOIN (
      SELECT nom, MAX(ladate) AS ladatemax
      FROM latable
      GROUP BY nom
    ) tmp ON t.nom = tmp.nom
    WHERE t.ladate = tmp.ladatemax
    ORDER BY nom
    Au passage, tu remarqueras que je n'ai pas appelé la table 'table' ni la colonne de date 'date'. Ce sont des mots du SQL et il faut éviter de les utiliser pour nommer les objets de la BDD.

    Et un classement alphabétique par nom en cadeau, ça ne fait pas de mal.

  3. #3
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Oui, on a souvent cette question... et à chaque fois, j'essaie de faire de la pub pour les fonctions analytiques !
    Selon ton SGBD (Oracle, SQL Server, Sybase au moins) les acceptent.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * FROM (
    SELECT a.*, ROW_NUMBER() OVER(PARTITION BY personne ORDER BY tadate DESC) as rk
    FROM TaTable
    )t
    WHERE rk = 1
    les fonctions analytiques te permettent de numéroter des lignes :
    - par group : PARTITION BY personne
    - selon un order ORDER BY tadate DESC

    Les requête qui englobe le tout permet de ne prende que les premiers de chaque groupe

  4. #4
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour Pacmann et Cinefil,

    je tenais à vous remercier. Cela fonctionne très bien pour cinefil. J'ai fait la requête sur deux tables. Effectivement c'est la meilleure des solutions.

    Par contre pacmann, j'ai essayé d'exécuter ta requête (sur access et sur Oracle SQL) et j'ai eu ce message d'erreur sous oracle:

    ORA-00439: Fonction non activée : OLAP Window Functions

    Peut etre que ma version n'est pas à jour. Mais bon quoi qu'il en soit j'ai eu réponse a ma question et je tenais vraiment à vous remercier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de requete avec MAX sur champ de type date
    Par boutmos dans le forum Requêtes
    Réponses: 6
    Dernier message: 11/04/2013, 11h02
  2. [AC-2007] requete MAJ avec Max(date)
    Par hugodu28 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 29/12/2011, 23h07
  3. [VB.NET] Requete avec des dates dans un DataSet
    Par leSeb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/10/2005, 15h30
  4. Pb requete avec MAX
    Par Karibou dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 18/08/2005, 15h05
  5. Requetes avec des dates
    Par PrinceMaster77 dans le forum SQL
    Réponses: 1
    Dernier message: 22/11/2004, 18h46

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