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 :

Problème sur une requête (GROUP BY)


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2002
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2002
    Messages : 203
    Points : 86
    Points
    86
    Par défaut Problème sur une requête (GROUP BY)
    Bonjour,

    j'ai une requete qui me retourne: Nom du traitement, date de derniere execution, etat
    Seul soucis, je fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Nom_trt, MAX(date), etat
    FROM BATCH
    GROUP BY Nom_trt, etat
    Il me retourne les traitements groupés par nom, ET etat.
    Moi, je veux juste le dernier traitements groupés par nom de traitement, et son etat.

    Je ne vois pas comment faire :/

    Je ne peux pas enlever etat de la clause GROUP BY (Oracle me renvoie une erreur)

    Je pense que c'est un cas d'école, mais je coince :/
    dbsanté: Ma première application Android consacré au suivi médical totalement déconnecté.
    Score Assistant: Dans un tout autre registre, une application pour compter les points de plus de 80 jeux !
    N'hésitez pas a les télécharger !!

  2. #2
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2002
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2002
    Messages : 203
    Points : 86
    Points
    86
    Par défaut
    en gros pour resume, ma table renvoie:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NOM_TRT ; Date ; Status
    A 12/04/2012 OK
    A 11/04/2012 KO
    B 12/04/2012 OK
    C 12/04/2012 KO
    C 11/04/2012 OK

    Moi je veux que le status des dernieres executions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    NOM_TRT ; Date ; Status
    A 12/04/2012 OK
    B 12/04/2012 OK
    C 12/04/2012 KO
    dbsanté: Ma première application Android consacré au suivi médical totalement déconnecté.
    Score Assistant: Dans un tout autre registre, une application pour compter les points de plus de 80 jeux !
    N'hésitez pas a les télécharger !!

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

    il faut utiliser keep ou une fonction analytique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Nom_trt, MAX(date), max(etat) keep (dense_rank first order by date desc) as etat
    FROM BATCH
    GROUP BY Nom_trt
    http://laurentschneider.com/wordpres...ow_number.html


    Et ne nommé pas une colonne "Date" c'est un mot réservé SQL

  4. #4
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2002
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2002
    Messages : 203
    Points : 86
    Points
    86
    Par défaut
    Au final, voici la réponse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A.Nom_trt, A.date, A.etat
    FROM BATCH A
    WHERE A.date = (SELECT MAX(B.DATE) FROM BATCH B WHERE B.id_trt = A.id_trt)
    Tout simplement
    dbsanté: Ma première application Android consacré au suivi médical totalement déconnecté.
    Score Assistant: Dans un tout autre registre, une application pour compter les points de plus de 80 jeux !
    N'hésitez pas a les télécharger !!

  5. #5
    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
    La solution que vous utilisez est, je penses, la pire que l'on puisse proposer.

    Votre table Batch doit être assez petite sinon votre serveur devrait assez avoir des temps de réponses défiant toute envie d'utiliser cette requête.

    C'est une requête corrélé qui va ré-exécuter autant de fois la sous-requête qu'il n'y a de ligne dans votre table batch. (A moins qu'oracle soit intelligent, vérifiez)


    Si vous ne voulez pas comprendre l'exemple posez, utilisez plutôt cette version là !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT A.Nom_trt, A.date, A.etat
    FROM BATCH A
    inner join (SELECT Nom_trt, MAX(B.DATE) as date FROM BATCH group by Nom_trt) as B on a.Nom_trt = b.Nom_trt and a.date = b.date
    On passe quand même par 2 scans de table au lieu d'un, mais bon, ça tiendra la route sur le long terme.

  6. #6
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2002
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2002
    Messages : 203
    Points : 86
    Points
    86
    Par défaut
    Je viens de tester votre requête, et les temps de réponse sont semblables.

    la table BATCH contient 130 000 lignes

    Je vais quand même approfondir mes recherches.

    (temps de réponse, 200ms)
    Merci
    dbsanté: Ma première application Android consacré au suivi médical totalement déconnecté.
    Score Assistant: Dans un tout autre registre, une application pour compter les points de plus de 80 jeux !
    N'hésitez pas a les télécharger !!

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 20/01/2011, 12h45
  2. [Optimisation] Problème sur une requête UNION.
    Par françois62 dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/06/2005, 16h08
  3. Aide sur une requête (Group By...??)
    Par Cocolapin dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/12/2004, 10h26
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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