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 :
Je désire faire un regroupement par nombre de CN par CC et prendre seul les 3 plus grands regroupement.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
Le regroupement :
produit :
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;
Les 3 meilleurs regroupements :NB CC
---------- -------------------------
6 Z
3 D
2 A
2 X
1 B
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é :
qui donne :
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
MAIS impossible de filtrer sur ce critère :NB CC RK
---------- ------------------------- ----------
6 Z 1
3 D 2
2 A 3
2 X 3
1 B 5
engendre :
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
Comment faire avec les fonctions analytiques ?WHERE RANK() OVER(ORDER BY T.NB DESC) <= 3
*
ERREUR à la ligne 8 :
ORA-30483: fonctions de fenêtrage interdites ici
Partager