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 :

[10gR1] Utilisation des fonctions analytiques


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut [10gR1] Utilisation des fonctions analytiques
    Salut,

    Je débute dans l'utilisation des fonctions analytiques.
    J'ai lu le tuto de Lalystar mais à ma grande surprise, je n'arrive pas à les appliquer sur l'exemple qui suit.

    Soit la table DVP suivante :
    CN CC
    ---------- ------------------------
    12 A
    20 A
    20 B
    2220 D
    2 D
    0 D
    0 X
    0 X
    0 Z
    1 Z
    2 Z
    3 Z
    4 Z
    4 Z
    Je désire faire un regroupement par nombre de CN par CC et prendre seul les 3 plus grands regroupement.

    Le regroupement :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT   COUNT(cn) AS NB,
    		     CC
    FROM     dvp
    GROUP BY CC
    ORDER BY NB DESC;
    produit :
    NB CC
    ---------- -------------------------
    6 Z
    3 D
    2 A
    2 X
    1 B
    Les 3 meilleurs regroupements :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT  NB, CC
    FROM   (SELECT   COUNT(CN) AS NB,
                     CC
            FROM     DVP
            GROUP BY CC
            ORDER BY NB DESC) T
    WHERE  (SELECT   COUNT(*)
            FROM ( SELECT   COUNT(CN) AS NB,
                            CC
        	         FROM     DVP
    	             GROUP BY CC
    	             ORDER BY NB DESC ) T2
            WHERE T.NB <= T2.NB
            AND   T.CC <> T2.CC ) <= 3

    Je voudrais réécrire (et simplifier) cette dernière requête avec les fonctions analytiques.
    Je pense avoir trouvé mon bonheur lorsque j'ai trouvé :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT   T.NB, T.CC,
    		     rank() over(order by T.NB desc) rk
    FROM     ( SELECT   COUNT(cn) AS NB,
               		      CC
               FROM     dvp
               GROUP BY CC
               ORDER BY NB DESC ) T
    ORDER BY NB DESC
    qui donne :
    NB CC RK
    ---------- ------------------------- ----------
    6 Z 1
    3 D 2
    2 A 3
    2 X 3
    1 B 5
    MAIS impossible de filtrer sur ce critère :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT   T.NB, T.CC,
    		     rank() over(order by T.NB desc) rk
    FROM     ( SELECT   COUNT(cn) AS NB,
               		      CC
               FROM     dvp
               GROUP BY CC
               ORDER BY NB DESC ) T
    WHERE RANK() OVER(ORDER BY T.NB DESC) <= 3
    ORDER BY NB DESC
    engendre :
    WHERE RANK() OVER(ORDER BY T.NB DESC) <= 3
    *
    ERREUR à la ligne 8 :
    ORA-30483: fonctions de fenêtrage interdites ici
    Comment faire avec les fonctions analytiques ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Une lumière m'éclaira soudainement :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT X.NB, X.CC, X.RK
    FROM ( SELECT   T.NB NB,
                    T.CC CC,
      		          RANK() OVER(ORDER BY T.NB DESC) RK
           FROM     ( SELECT   COUNT(CN) AS NB,
                      		      CC
                      FROM     DVP
                      GROUP BY CC
                      ORDER BY NB DESC ) T
           ORDER BY NB DESC ) X
    WHERE X.RK < 4
    ORDER BY X.NB DESC;

    Bien sûr => il faut faire intervenir les fonctions analytiques à un niveau "inférieur" tout comme on le fait pour trier sur le rownum.

    Désolé pour le dérangement !

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

Discussions similaires

  1. utilisation des fonctions analytiques
    Par LEK dans le forum SQL
    Réponses: 10
    Dernier message: 03/04/2007, 13h27
  2. [Xml/XSl] utiliser des fonction vb
    Par ekmule dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/01/2006, 17h28
  3. [hibernate] utilisation des fonctions d'aggregation
    Par osopardo dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/08/2005, 09h41
  4. utilisation des fonctions d'une dll
    Par jackk dans le forum C++
    Réponses: 14
    Dernier message: 15/06/2005, 16h50
  5. Utiliser des fonctions Pascal
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/03/2004, 15h43

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