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

Oracle Discussion :

Les 5 dernières factures de chaque vendeur


Sujet :

Oracle

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Les 5 dernières factures de chaque vendeur
    Mon problème parait simple quand il est ennoncé, mais je tourne en rond depuis pas mal de temps
    , et il faut que je trouve une solution...

    Sous forme simplifiée voici la structure dont je dispose
    Il n'y a qu'une table FACTURES
    avec 3 colonnes : NUMFACT, DATEFACT, VENDEUR

    Je veux obtenir les 5 dernières factures passées par chaque vendeur, et cela en une seule requête

    Merci d'avance à ceux qui vont se pencher sur mon pb

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Les premiers peuvent aussi être les derniers :http://oracle.developpez.com/faq/?page=3-1#rownum

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Si ta table n'est pas trop ennorme, tu peux passer par les fonctions analytiques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select * from 
      (
       select NUMFACT, DATEFACT, VENDEUR,
       row_number() over (partition by VENDEUR order by DATEFACT desc) posit 
       from FACTURES
      )
    where posit <= 5

  4. #4
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par remi4444
    Si ta table n'est pas trop ennorme, tu peux passer par les fonctions analytiques:
    bonjour remi444

    juste au passage pq fais tu cette remarque sur les fonctions analytiques ?

    j'ai observé pour ma part des résultats très probants sur des tables relativement importantes (>1M) avec les fonctions analytiques versus GROUP BY+HAVING pour avoir le même résultat.

    je me souviens même d'un tuto sur ce site de Laly qui fournissait des traces significatives au niveau des I/O.

    Merci de ton avis
    PpPool

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Oui, ça sera toujours meilleur qu'un group-by/having. Mais dans ces 2 cas il faut savoir que l'acces à la table sera complet. Dans l'hyposèse ou il y a peu de vendeurs avec des milliers de factures chacun, la requête va se fatiguer pour rien à donner un numéro à chaque facture alors que seules les 5 dernières sont interressante. Dans ce cas là il faudra réfléchir à faire un index sur le couple (VENDEUR/DATEFACT ) avec l'option "DESC" tant qu'a faire, puis faire une requete à base de "order-by desc" et de rownum. Oracle utilisera alors du "COUNT-STOPKEY" ce qui évitera de parcourir toute la table.

  6. #6
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par remi4444
    Oui, ça sera toujours meilleur qu'un group-by/having. Mais dans ces 2 cas il faut savoir que l'acces à la table sera complet. Dans l'hyposèse ou il y a peu de vendeurs avec des milliers de factures chacun, la requête va se fatiguer pour rien à donner un numéro à chaque facture alors que seules les 5 dernières sont interressante. Dans ce cas là il faudra réfléchir à faire un index sur le couple (VENDEUR/DATEFACT ) avec l'option "DESC" tant qu'a faire, puis faire une requete à base de "order-by desc" et de rownum. Oracle utilisera alors du "COUNT-STOPKEY" ce qui évitera de parcourir toute la table.


    je me demandai s'il n'y avait pasautre chose que je ne savais pas sur les fonctions analytiques.
    On est d'accord.
    Merci encore de ta réponse
    PpPool

  7. #7
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Manu_Karpov
    Je veux obtenir les 5 dernières factures passées par chaque vendeur, et cela en une seule requête
    Supposons que le numéro de facture soit représenté par l'attribut Fact_No et que le critère soit la date de facture, Fact_Date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Select Distinct x.Fact_No, x.Fact_Date  
    From   Factures As x
    Where (Select Count(*)
           From   Factures As y
           Where  y.Fact_No = x.Fact_No
           And    y.Fact_Date > x.Fact_Date) < 5
    Order by Fact_No, Fact_Date ;
    Je n’ai pas testé, donc à vérifier...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  8. #8
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Le principe est beau, mais en matiere de performance c'est une catastrophe, car l'optimiseur n'est pas assez malin pour traduire cette requête en classement/comptage...

    a vérifier là aussi...

  9. #9
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Remi4444
    Le principe est beau, mais en matiere de performance c'est une catastrophe, car l'optimiseur n'est pas assez malin pour traduire cette requête en classement/comptage...
    Pour être objectif, passer par un EXPLAIN PLAN et tester...

    Si les résultats confirment l'incantation, soit, et chercher autre chose, mais de grâce, pas d'a priori.

    Comme disait Henri Poincaré, "L'intuition trouve, le raisonnement prouve".

    Je rappelle que sur la base de la seule intuition, SQL n'aurait jamais vu le jour. Il a fallu que Don Chamberlin et son équipe construisent le prototype System R et mesurent et remesurent pour arriver à la conclusion surprenante que SQL était plus performant que les SGBD de l'époque (non relationnels et pour cause), cela contre toute attente...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/04/2007, 18h36
  2. Extraire les 20 dernières valeurs uniquement
    Par bob75000 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 19/07/2006, 14h17
  3. Dernière image de chaque utilisateur
    Par florenm dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/05/2006, 13h26
  4. Réponses: 3
    Dernier message: 01/05/2006, 14h09
  5. Moyenne 5 dernières année pour chaque année?
    Par kissmytoe dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/02/2006, 19h28

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