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 :

Requête select avec group by


Sujet :

SQL Oracle

  1. #1
    Membre habitué Avatar de H-bil
    Inscrit en
    Février 2006
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 337
    Points : 151
    Points
    151
    Par défaut Requête select avec group by
    Bonjour tout le monde

    J'ai la table suivante (table.png) avec les 3 colonne PK, FK et TIME
    le PK est une clé primaire.
    chaque FK peut avoir plusieurs TIME



    Comment faire pour récupérer pour chaque FK le MAX du TIME mais avec le PK correspondant

    Bref, je veux avoir le résultat suivant mais avec une colonne supplémentaire qui est le PK

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select fk, max(time)
    from tab 
    group by fk

    D'avance merci
    Images attachées Images attachées  
    Ubuntu 8.04 LTS Hardy

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Attention, la date max peut être trouvée pour 2 PK différentes je suppose.

    Moi je te conseille de faire un select avec un where not in, and dans celui-ci tu cherche le max.
    Tu met les group by qu'il faut et l'affaire est jouée
    Le Porc est un loup pour le Porc.

  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
    Un grand classique...
    Cela fait partie des requêtes qui sont données au moins une fois par mois sur ces forums.

    Je vais être gentil et te donner une réponse, même si l'envie me titille de te demander de chercher un peu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT  fk
        ,   pk
        ,   time
    FROM    tab AS tb1
    WHERE   EXISTS
            (   SELECT  1
                FROM    tab AS tb2
                WHERE   tb1.fk  = tb2.fk
                GROUP BY tb2.fk
                HAVING  max(tb2.time) = tb1.time
            )
    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
    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
    Bonjour,

    Selon votre SGBD une fonction de fenetrage pourra réaliser ceci avec 1 seul scannage de table (contre 2 ici).

    regardez du coté des fonctions : Keep(), row_number(), etc

  5. #5
    Membre habitué Avatar de H-bil
    Inscrit en
    Février 2006
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 337
    Points : 151
    Points
    151
    Par défaut
    Merci pour vos réponse

    @punkoff j'utilise Oracle 10g

    @al1_24
    Ta requête marche super bien merci

    Toute fois, j'ai encore une petite question:
    ici tab est une requête de quelque lignes, y'a-t-il une méthode de ne pas répéter
    deux fois ma même sous requêtes ?
    Ubuntu 8.04 LTS Hardy

  6. #6
    Membre émérite 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 : 37
    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
    Points : 2 520
    Points
    2 520
    Par défaut
    Tu peux utiliser la fonction WITH pour ça :

    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
    WITH tab AS (
    TaRequete
    )
     
    SELECT  fk,
       pk,
       time
    FROM tab AS tb1
    WHERE   EXISTS
            (   SELECT  1
                FROM    tab AS tb2
                WHERE   tb1.fk  = tb2.fk
                GROUP BY tb2.fk
                HAVING  max(tb2.time) = tb1.time
            )
    ~ Lola ~

  7. #7
    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
    bonjour,

    Oracle 10g dans ce cas ... http://lalystar.developpez.com/fonct...lytiques/#L3.9

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select 
     pk,
     max(fk) keep(dense_rank first order by time desc),
     max(time)
    from ma_table
    group by pk
    (j'ai pas oracle sous la main mais ça devrait le faire)

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

Discussions similaires

  1. Requête Select avec ntext et group by
    Par Bobble dans le forum Développement
    Réponses: 12
    Dernier message: 30/07/2010, 10h30
  2. Requête SELECT avec deux champs dans une colonne ??
    Par fredhali2000 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 08/06/2006, 10h41
  3. Requête selection avec une variable de date
    Par kahmsin dans le forum Access
    Réponses: 7
    Dernier message: 20/11/2005, 19h38
  4. [Débutant] Requête SELECT avec max et sous-requête
    Par joefou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/07/2005, 14h28
  5. selection avec group by mais ne garder que ...
    Par Larson dans le forum Langage SQL
    Réponses: 13
    Dernier message: 22/06/2005, 17h23

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