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 :

Optimisation de recherche de max


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 78
    Points
    78
    Par défaut Optimisation de recherche de max
    Bonjour,

    j'aimerais récupérer dans une table le max d'un montant avec des données associées et le tout groupé par "Nom" et "numéro de contrat".
    Actuellement j'ai ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT  C1.NOM,
                C1.NUM_CTA,
                C1.MNT_FACTURE,
                C1.PRENOM,
                C1.ADRESSE
    FROM    CLIENT C1
    WHERE   C1.MNT_FACTURE = (  SELECT MAX(C2.MNT_FACTURE) 
                                FROM    CLIENT C2
                                WHERE   C1.NOM      = C2.NOM
                                AND     C1.NUM_CTA  = C2.NUM_CTA)
    Le problème c'est que je me fais 2 lectures full sur ma table CLIENT qui fait presque 1 million de lignes, ce qui prend du temps.

    Bref j'aimerais faire un truc optimisé mais je ne trouve aucune bonne idée
    du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT  C1.NOM,
                C1.NUM_CTA,
                MAX(C1.MNT_FACTURE),
                C1.PRENOM
                C1.ADRESSE
    FROM    CLIENT C1
    GROUP BY C1.NOM,  C1.NUM_CTA
    Alors forcément ça ne marche pas le truc au dessus mais c'est comme ça que j'aimerais faire


    Si quelqu'un a une bonne réponse à m'apporter je suis preneur
    Merci

  2. #2
    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 !

    Je suppose que tu peux avoir plusieurs lignes correspondant au max ?
    Dans ce cas, les fonctions analytiques devraient pouvoir t'aider :
    Tu classes tes lignes par mnt_facture décroissant, en donnant le même rang au ex-aequo,puis tu filtres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * FROM (
    SELECT dense_rank() over(order by mnt_facture desc) as rk, c1.*
    FROM CLIENT c1
    )
    WHERE rk = 1

  3. #3
    Membre averti Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Points : 334
    Points
    334
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Salut !

    Je suppose que tu peux avoir plusieurs lignes correspondant au max ?
    Dans ce cas, les fonctions analytiques devraient pouvoir t'aider :
    Tu classes tes lignes par mnt_facture décroissant, en donnant le même rang au ex-aequo,puis tu filtres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT  FROM (
    SELECT dense_rank() over(order by mnt_facture desc) as rk, c1.*
    FROM CLIENT c1
    )
    WHERE rk = 1

    Bonjour,


    C'est une belle solution!

    Juste une petite ramarque, sachant qu'il faut grouper selon "nom" et "NUM_CTA", il manque une clause PARTITION BY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT *
    FROM (SELECT nom,
                        prenom,
                        adresse,
                        mnt_facture,
                        num_cta,
                        dense_rank() over(PARTITION BY nom, num_cta ORDER BY mnt_facture DESC) AS rk) sbq1
    WHERE (sbq1.rk = 1)
    Cordialement,
    Dariyoosh

  4. #4
    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
    Ah désolé, j'avais mal lu

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 78
    Points
    78
    Par défaut
    Merci pour vos réponses fort utiles

  6. #6
    Membre averti Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Points : 334
    Points
    334
    Par défaut
    Citation Envoyé par tchoimars Voir le message
    Merci pour vos réponses fort utiles
    Est-ce que tu as observé une différence de temps considérable après avoir utilisé la solution analytique?

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

Discussions similaires

  1. [Optimisation] Taille des champs max de chaines de caractere
    Par okparanoid dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/04/2007, 09h12
  2. [DAO]type non défini / recherche valeur max dans un champ
    Par petitours dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 23/04/2007, 09h59
  3. Réponses: 5
    Dernier message: 12/01/2007, 10h57
  4. Optimisation et Recherche opérationnelle : quel algo ?
    Par temar dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 01/04/2006, 16h46
  5. rechercher le max d'un champ sur 2 tables
    Par rdams dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/03/2006, 13h27

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