Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/01/2007, 07h40   #1
Invité de passage
 
Inscription : janvier 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 2
Points : 1
Points : 1
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
Manu_Karpov est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 08h14   #2
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Les premiers peuvent aussi être les derniers :http://oracle.developpez.com/faq/?page=3-1#rownum
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 10h25   #3
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
Si ta table n'est pas trop ennorme, tu peux passer par les fonctions analytiques:

Code :
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
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 13h55   #4
Membre éclairé
 
Inscription : novembre 2002
Messages : 533
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 533
Points : 359
Points : 359
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
PpPool est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 15h15   #5
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
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.
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 15h18   #6
Membre éclairé
 
Inscription : novembre 2002
Messages : 533
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 533
Points : 359
Points : 359
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
PpPool est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 16h27   #7
Expert Confirmé Sénior

 
Avatar de fsmrel
 
Spécialiste en bases de données
Inscription : septembre 2006
Messages : 2 886
Détails du profil
Informations professionnelles :
Activité : Spécialiste en bases de données
Secteur : Conseil

Informations forums :
Inscription : septembre 2006
Messages : 2 886
Points : 5 135
Points : 5 135
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 :
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...
__________________
_
Faites simple, mais pas plus simple ! (A. Einstein)
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 (Bonne lecture !)
fsmrel est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 19h13   #8
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
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...
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 26/01/2007, 19h33   #9
Expert Confirmé Sénior

 
Avatar de fsmrel
 
Spécialiste en bases de données
Inscription : septembre 2006
Messages : 2 886
Détails du profil
Informations professionnelles :
Activité : Spécialiste en bases de données
Secteur : Conseil

Informations forums :
Inscription : septembre 2006
Messages : 2 886
Points : 5 135
Points : 5 135
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...
__________________
_
Faites simple, mais pas plus simple ! (A. Einstein)
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 (Bonne lecture !)
fsmrel est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h23.


 
 
 
 
Partenaires

Hébergement Web