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 :

une fonction analytique ?


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Par défaut une fonction analytique ?
    bonjour,

    je suis tout jeune sous SQL/Oracle, je suis sous 9.2.0.6.

    Voici mon pb : j'ai une table :
    - GROUPS(ID_GROUP, ...., ID_USER) : 2 champs intéressants
    et une table
    - USERS(ID_USER, MO, MO_DATE) : 3 champs dont MO en Integer et MO_DATE en Date => volume en Mo par date par user

    Je voudrais avoir pour chaque groupe (ID_GROUP) les 3 plus gros volumes et les 3 dates correspondantes, comment écrire cela ??
    Merci bcp de votre aide.

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select ID_GROUP, ID_USER, MO, MO_DATE from (
      select ID_GROUP, ID_USER, MO, MO_DATE,
        rank() over (partition by id_group order by mo desc) r
      from GROUPS join USERS using (ID_USER)
    ) where r<4;
    regarde la différence entre RANK, DENSE_RANK et ROW_NUMBER suivant comment tu veux gérer les montant MO égaux

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Par défaut
    ok merci !!
    en fait il me semble que ce serait cela :
    select ID_GROUP, SUM_MO, MO_DATE, r from
    (
    select ID_GROUP, SUM(MO) as SUM_MO, MO_DATE,
    row_number() over (partition by ID_GROUP order by SUM(MO) desc) r
    from GROUPS inner join USERS on GROUPS.USER_ID=USERS.ID_USER
    group by id_group, MO_DATE
    )
    where r < 4

    ça tourne, ça a l'air bon ... à vérifier.

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Par défaut optimisation
    il n'exsite pas une fonction qui renvoie directement les x premiéres lignes (x à paramétrer dans la fonction, pour mon cas x=3) plutot que de passer par une sous requete afin de mettre la clause Where ensuite ?
    => possibilité d'écrire le résultat en 1 seule requete ? (sans ss requete)

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Quel est ton problème avec les sous requêtes ?

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Par défaut
    je ne peux pas utiliser de sous requetes car j'utilise BO (Business Objects), plus exactement Webi et dans ce cas là, au mieux ma sous requete peut ramener un champ or dans mon cas elle doit me ramener 3 champs.

    Du coup, au lieu d'utiliser "where r < 4" j'ai voulu utiliser un having mais ce SQL ne passe pas.

    Bref, si je pouvais écrire mon besoin en 1 seule requete, ce serait parfait.

Discussions similaires

  1. Réponses: 8
    Dernier message: 04/02/2013, 16h54
  2. Calcul d'une fonction analytique inverse
    Par matxl dans le forum Mathématiques
    Réponses: 3
    Dernier message: 31/05/2008, 14h15
  3. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22
  4. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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