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 :

MAX sous Oracle


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Par défaut MAX sous Oracle
    bonjour
    J'ai une table qui contient ses données

    NUM CAUTION DATED DATEF
    3 05/0055 10/02/2013
    4 05/0055 10/02/2013
    5 05/0055 06/06/2016 09/06/2019
    2 05/0055 24/06/2012
    1 05/0055 10/02/2013

    je souhaiterais récupérer la plus grande ligne qui correspond au max

    5 05/0055 06/06/2016 09/06/2019
    merci

  2. #2
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Bonjour,

    Qu'est ce que tu n'arrives pas à faire ?

    Au niveau du max tu veux prendre quoi : NUM, DATED ou DATEF ?

    Pour info la fonction c'est MAX(MaColonne)

  3. #3
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Pour infos voici l'idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT A.* 
    FROM MaTable A
         JOIN (
             SELECT MAX(MaColonne) AS max_m
             FROM MaTable
         ) AS B
         ON A.id = B.max_m
    A adapter bien sur

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Par défaut
    oui j'ai tenté avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select  max (t.num ), t.caution,t.dated,t.datef from prolongation t
    mais ça donne message d'erreur

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 133
    Par défaut
    Quel message d'erreur ?
    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.

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Quel message d'erreur ?
    message :
    la fonction groupe ne porte pas sur un groupe simple

  7. #7
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    C'est parce que tu n'as pas mis de GROUP BY dans ta requête.

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    codage simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT num, caution, dated, datef 
    FROM prolongation
    WHERE num = (select max(num) from prolongation)

    Sinon plus compliqué, avec les fonctions analytiques [un seul accès à la table]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT max(num) keep (dense_rank first order by num desc) num, max(caution) keep (dense_rank first order by num desc) caution,
    max(dated) keep (dense_rank first order by num desc) dated,
    max(datef ) keep (dense_rank first order by num desc) datef 
    FROM prolongation

  9. #9
    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
    Citation Envoyé par McM Voir le message
    codage simple :
    [...]
    Sinon plus compliqué, avec les fonctions analytiques [un seul accès à la table]
    A nuancer dans le cas ou on a pas une valeur unique sur la colonne ou on fait le MAX.
    Dans votre version analytique on recupere un seul resultat au lieu des eventuels doubles.
    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
    TMP@MINILHC >create table tmp as select mod(level,5) as n, level as max_val from dual connect by level<20;
     
    Table created.
     
    Elapsed: 00:00:00.06
    TMP@MINILHC >select * from tmp where n=(select max(n) from tmp);
     
             N    MAX_VAL
    ---------- ----------
             4          4
             4          9
             4         14
             4         19
     
    Elapsed: 00:00:00.01
    TMP@MINILHC >select max(n) keep (dense_rank first order by n desc),max(max_val) keep (dense_rank first order by n desc) from tmp;
     
    MAX(N)KEEP(DENSE_RANKFIRSTORDERBYNDESC) MAX(MAX_VAL)KEEP(DENSE_RANKFIRSTORDERBYNDESC)
    --------------------------------------- ---------------------------------------------
                                          4                                            19
     
    Elapsed: 00:00:00.00

  10. #10
    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
    Pas de clause OVER => pas de fonction analytique (je me suis fait avoir aussi).

    Les fonctions FIRST et LAST (et non pas keep) existent dans les deux versions analytiques et agrégats :
    http://docs.oracle.com/cd/E11882_01/...htm#SQLRF00641

    Mcm, pour la première ligne du code, max(num) suffit !

    À ne pas oublier aussi la version normative :
    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
    23
    24
    With tmp AS 
    (
        SELECT mod(level, 5) AS n
             , level         AS max_val
          FROM dual
    CONNECT BY level < 20
    )
      ,  SR as
    (
    select n, max_val
         , row_number() over(order by n desc) as rn
         , dense_rank() over(order by n desc) as dr
      from tmp
    )
    SELECT n, max_val
      FROM SR
     WHERE dr = 1; -- choisir rn = 1 pour un seul retour
     
    N    MAX_VAL
    --- -------
    4    4
    4    19
    4    14
    4    9

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    NUM	CAUTION	DATED	DATEF	
    3	05/0055	10/02/2013		
    4	05/0055	10/02/2013	
    5	05/0055	10/02/2013		
    7	05/0053	25/06/2012	09/06/2019	
    2	05/0053	24/06/2012		
    1	05/0056	25/06/2012
    mais je veux faire par numéro caution car cette requête donne le max des lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT num, caution, dated, datef 
    FROM prolongation
    WHERE num = (SELECT max(num) FROM prolongation)
    je cherche à afficher
    5 05/0055 10/02/2013
    7 05/0053 25/06/2012 09/06/2019
    2 05/0053 24/06/2012

  12. #12
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Tu peut utiliser cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT A.* 
    FROM prolongation A
         JOIN (
             SELECT MAX(Num) AS max_m, caution
             FROM prolongation
             GROUP BY caution
         ) AS B
         ON A.id = B.max_m 
         AND A.caution = B.caution

  13. #13
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Par défaut
    Citation Envoyé par lola06 Voir le message
    Tu peut utiliser cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT A.* 
    FROM prolongation A
         JOIN (
             SELECT MAX(Num) AS max_m, caution
             FROM prolongation
             GROUP BY caution
         ) AS B
         ON A.id = B.max_m 
         AND A.caution = B.caution
    bonjour
    mais join fonctionne pas
    message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORA-00933: La commande SQL ne se termine pas correctement

  14. #14
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Quelle est ta version d'oracle ?

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    De mémoire, il ne doit pas aimer le "AS B".

    Sans le "AS" ca devrait passer

  16. #16
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Citation Envoyé par punkoff Voir le message
    De mémoire, il ne doit pas aimer le "AS B".

    Sans le "AS" ca devrait passer
    Effectivement, je le met jamais d'habitude dsl

  17. #17
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Par défaut
    même sans AS ça fonctionne pas
    j'utilise oracle 8i
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT A.* 
    FROM prolongation A
         JOIN (
             SELECT MAX(Num)  max_m, caution
             FROM prolongation
             GROUP BY caution
         )  B
         ON A.id = B.max_m 
         AND A.caution = B.caution
    j'ai essayé une requête comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    SELECT  A.*,B.*
    FROM  prolongation A   ,
    (select  MAX(Num) AS max_m, caution FROM prolongation  GROUP BY caution )  B
    ça m'affiche
    3 05/0055 10/02/2013 5 05/0055
    4 05/0055 10/02/2013 10/06/2016 5 05/0055
    5 05/0055 25/06/2012 09/06/2019 5 05/0055
    2 05/0055 24/06/2012 5 05/0055
    1 05/0056 25/06/2012 5 05/0055
    3 05/0055 10/02/2013 1 05/0056
    4 05/0055 10/02/2013 10/06/2016 1 05/0056
    5 05/0055 25/06/2012 09/06/2019 1 05/0056
    2 05/0055 24/06/2012 1 05/0056
    1 05/0056 25/06/2012 1 05/0056

    je veux que ce deux ligne qui s'affiche
    5 05/0055 25/06/2012 09/06/2019 5 05/0055
    1 05/0056 25/06/2012 1 05/0056

    si j'ajoute cette condition
    where A.NUM=B.NUM
    alors message d'erreur
    nom de colonne non valide 'B.NUM'

  18. #18
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Si tu es en 8i alors c'est normal que ça ne marche pas

    Pour ta deuxième requête tu n'as pas fait la jointure entre tes deux tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  A.*,B.* 
    FROM  prolongation A   , 
    (SELECT  MAX(Num) AS max_m, caution FROM prolongation  GROUP BY caution )  B
    WHERE A.num = B.max_m       
    AND A.caution = B.caution
    La colonne num n'existe pas dans B puisque nous avons renommé le max avec max_m.

Discussions similaires

  1. Nombre max de table sous Oracle
    Par chris0938 dans le forum Oracle
    Réponses: 4
    Dernier message: 18/05/2010, 13h08
  2. requete pour recuperer un max sous oracle
    Par donny dans le forum Langage SQL
    Réponses: 5
    Dernier message: 22/11/2007, 09h35
  3. Pas de JOIN sous Oracle (vraiment dommage...)
    Par Isildur dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/03/2007, 11h28
  4. Cryptage de colonnes sous Oracle
    Par Julian Roblin dans le forum SQL
    Réponses: 9
    Dernier message: 28/11/2006, 18h24
  5. Recherche de texte dans un blob sous oracle
    Par Invité dans le forum Bases de données
    Réponses: 5
    Dernier message: 25/05/2004, 11h11

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