[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 :
Citation:
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:
1 2 3 4 5
| SELECT COUNT(cn) AS NB,
CC
FROM dvp
GROUP BY CC
ORDER BY NB DESC; |
produit :
Citation:
NB CC
---------- -------------------------
6 Z
3 D
2 A
2 X
1 B
Les 3 meilleurs regroupements :
Code:
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:
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 :
Citation:
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:
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 :
Citation:
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 ?