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


Sujet :

Langage SQL

  1. #1
    Membre éclairé Avatar de Le Pharaon
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 880
    Points : 742
    Points
    742
    Par défaut Requete avec Max
    Bonjour tout le monde
    J'ai une table structurée comme suit :
    DatePrise Heure
    01/12/2005 01:00
    01/12/2005 23:00
    Je veux une requête qui me permet de choisir la ligne qui a la date la plus récente et au cas où il y'en a deux (comme dans mon exemple) de prendre celle qui a l'heure la plus récente (la deuxième ligne dans ce cas)

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Sous Oracle, cela donne quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select *
    from matable
    where (dateprise, heure) = (select max (dateprise), max (heure)
                                 from matable);
    Sous un autre SGBD (pas terrible au niveau perf ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select * 
    from matable
    where (dateprise, heure) = (select max(dateprise), max (heure)
                                 from matable
                                 where date_prise = (select max (dateprise) from matable));
    NB : tu peux également trier tes lignes par date et heure décroissante et ne prendre que la première ligne.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 99
    Points : 110
    Points
    110
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select datePrise , max(heure) 
    from matable 
    where datePrise = (select max(datePrise) from matable)
    group by datePrise;
    plaineR, pour moi, ton code retourne la date max et l'heure max mais l'heure max pour n'importe quelle date et je ne crois pas que ce soit cela que Bujuman demande.

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Merci de préciser votre SGBD !

    Si Oracle, c'est facile (et intuitif) avec le ROW VALUE CONSTRUCTOR.

    Sinon, cf de toute façons cette page qui donne la solution "standard" : http://sqlpro.developpez.com/cours/sqlaz/select/#L8.

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par Mystro
    plaineR, pour moi, ton code retourne la date max et l'heure max mais l'heure max pour n'importe quelle date et je ne crois pas que ce soit cela que Bujuman demande.
    J'ai répondu un peu vite. Pour éviter toute confusion, j'ai précisé mon précédent post.

  6. #6
    Membre éclairé Avatar de Le Pharaon
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 880
    Points : 742
    Points
    742
    Par défaut
    Merci à vous tous
    Permettez moi de tester un peu vos codes respectifs, je vous informerai ensuite

  7. #7
    Membre éclairé Avatar de Le Pharaon
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 880
    Points : 742
    Points
    742
    Par défaut
    Citation Envoyé par plaineR
    Sous un autre SGBD (pas terrible au niveau perf ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select * 
    from matable
    where (dateprise, heure) = (select max(dateprise), max (heure)
                                 from matable
                                 where date_prise = (select max (dateprise) from matable));
    Je reçois le message d'erreur suivant :

    Erreur dans la clause WHERE à côté de ','.
    Impossible d'analyser le texte de la requête.

  8. #8
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Et si tu remplaces le "=" par "in" ?

    Sinon essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * 
    from matable a
    where dateprise = (select max(dateprise) from matable)
      and heure = (select max(heure) from matable where dateprise = a.dateprise)

  9. #9
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Tu ne nous a toujours pas indiqué ton SGBD ?

  10. #10
    Membre éclairé Avatar de Le Pharaon
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 880
    Points : 742
    Points
    742
    Par défaut
    Citation Envoyé par Xo
    Tu ne nous a toujours pas indiqué ton SGBD ?
    Je m'excuse Xo, je croyais que cette requête pourrait être indépendante du SGBD.
    Je suis sous Sql Server

  11. #11
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par Bujuman
    Je suis sous Sql Server
    Le mieux, c'est de préciser systématiquement


    Un code tel que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (DatePrise, Heure) = ...
    est réservé à Oracle (cf lien ci-dessus).


    Par contre, la dernière solution de PlaineR devrait te convenir, non ?

    Voici mon jeu d'essais (testé sous Oracle :
    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
    16
    17
    18
    19
    20
    21
    22
    CREATE TABLE Evenement (
    DatePrise VARCHAR2 (10),
    Heure     VARCHAR2 (8));
     
    INSERT INTO Evenement (DatePrise, Heure) VALUES ('2005/12/01', '01:00:00');
    INSERT INTO Evenement (DatePrise, Heure) VALUES ('2005/12/01', '23:00:00');
    INSERT INTO Evenement (DatePrise, Heure) VALUES ('2005/11/30', '04:00:00');
    INSERT INTO Evenement (DatePrise, Heure) VALUES ('2005/11/30', '23:30:00');
     
    COMMIT;
     
    SELECT *
      FROM Evenement A
     WHERE DatePrise = (SELECT Max(DatePrise) 
                          FROM Evenement)
       AND Heure = (SELECT Max(Heure) 
                      FROM Evenement 
                     WHERE DatePrise = A.DatePrise);
     
    DATEPRISE  HEURE
    ---------- --------
    2005/12/01 23:00:00
    Pour me simplifier la vie, j'ai bien entendu gérer dates et heures dans des varChar2, en plaçant les valeurs les plus significatives en début de chaînes (année, puis mois, puis jour). Peut-être te sera t'il nécessaire d'adapter en fonction du type de tes champs et de la manière dont tu gères les données ?

  12. #12
    Membre éclairé Avatar de Le Pharaon
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 880
    Points : 742
    Points
    742
    Par défaut
    Merci à vous tous, et je m'excuse du retard de ma réaction. La communauté musulmane était en fête durant le semaine passée
    Je vais reprendre les tests, ma requête est un bizarre sinon j'allais vous l'envoyer

Discussions similaires

  1. Problème Requete avec MAX()
    Par kro001 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 12/04/2007, 09h54
  2. Requete avec max
    Par richard038 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/02/2007, 16h50
  3. [SQL Server] Requete avec MAX et group by
    Par joKED dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/01/2007, 14h00
  4. Requete avec max et group by
    Par Maxime555 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/07/2006, 12h48
  5. Pb requete avec MAX
    Par Karibou dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 18/08/2005, 15h05

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