Overblog Suivre ce blog
Editer l'article Administration Créer mon blog
14 juillet 2012 6 14 /07 /juillet /2012 18:29

 

SQL RANK.

Comment utiliser la fonction analytique RANK.
Comment utiliser la fonction d'agrégation RANK.

La fonction RANK renvoie le rang d'une valeur dans un groupe de valeurs.
La fonction RANK peut être utilisée en tant que fonction d'agrégation ou fonction analytique.

Fonction RANK en fonction d'Agrégation.

 
 RANK(list) WITHIN GROUP (ORDER BY col_list[ASC|DESC] [NULLS {first|last}]) 

Jeu d'essai pour la fonction RANK.

 ENAME SAL DEPTNO ---------- ---------- ---------- SMITH 800,5 10 ALLEN 1600 30 WARD 1250 30 JONES 2975 30 MARTIN 1250 40 DANIEL 1000 10 JOHN 1600 30 

 

 
 SQL> SELECT RANK(2000) WITHIN GROUP (ORDER BY sal DESC) "Rank of 2000" FROM emp; Rank of 2000 ------------ 2 SQL> 

Ici la fonction RANK calcule le rang d'un salaire hypothétique identifié par l'argument de la fonction RANK.
Un salaire de 2000 en cas d'embauche par exemple serait le deuxième plus gros salaire de ce jeu d'essai.

 


Fonction RANK en fonction Analytique.

 
 RANK() OVER ( [ query_partition_clause] ORDER BY clause ); 

OVER indique qu'on utilise une fonction analytique.

 
 SQL> SELECT deptno, ename, sal, RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) "Rank" FROM emp; DEPTNO ENAME SAL Rank ---------- ---------- ---------- ---------- 10 DANIEL 1000 1 10 SMITH 800,5 2 30 JONES 2975 1 30 JOHN 1600 2 30 ALLEN 1600 2 30 WARD 1250 4 40 MARTIN 1250 1 7 ligne(s) sélectionnée(s). SQL> 

RANK par département, si au moins deux lignes sont liées pour un rang, chacune d'entre elles reçoit le même RANK (JOHN et ALLEN).
La fonction RANK ne retourne pas toujours des entiers consécutifs contrairement à la fonction DENSE_RANK (WARD devrait avoir le RANK 3 et non pas le RANK 4 dans le département 30).

Fonction DENSE_RANK en fonction Analytique.

 
 SQL> SELECT deptno, ename, sal, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) "Rank" FROM emp; DEPTNO ENAME SAL Rank ---------- ---------- ---------- ---------- 10 DANIEL 1000 1 10 SMITH 800,5 2 30 JONES 2975 1 30 JOHN 1600 2 30 ALLEN 1600 2 30 WARD 1250 3 40 MARTIN 1250 1 7 ligne(s) sélectionnée(s). SQL> 

La fonction DENSE_RANK retourne des entiers consécutifs maintenant.

La pseudo-colonne ROWNUM, si elle est utilisée dans une vue, peut fournir un classement, mais ne donnerait pas d'égalité sur le RANK des valeurs dupliquées et ne sautera pas les valeurs en double.

Haut de Page www.dba-ora.fr

Partager cet article

Repost 0
Published by Oracle SQL - dans FUNCTIONS - SQL
commenter cet article

commentaires

Yabo Joel Tchindebe 21/11/2016 16:22

thanks for your explanation about function rank