Oracle SQL : Comprendre RANK() et DENSE_RANK()
Cet article clarifie les principales différences entre les fonctions RANK()
et DENSE_RANK()
dans Oracle SQL, en se concentrant sur leur comportement de classement, en particulier lorsqu'il s'agit de liens et de valeurs NULL.
Différences clés :
Les deux fonctions attribuent des classements aux lignes d'un ensemble de données en fonction de l'ordre spécifié. La différence cruciale réside dans leur gestion des cravates :
RANK()
: attribue le même rang aux lignes à égalité, ce qui entraîne des écarts dans la séquence de classement. Si plusieurs lignes partagent un rang, le rang suivant saute les rangs à égalité. Par exemple, si trois lignes sont à égalité pour la deuxième place, elles recevront toutes le rang « 2 » et le rang suivant sera « 5 ».
DENSE_RANK()
: Attribue des rangs consécutifs sans écarts, même en cas d'égalité. Il n'y a pas de saut de rang ; la séquence de classement reste continue.
Application pratique : Trouver le nième salaire le plus élevé
Pour récupérer le nième salaire le plus élevé de la table emptbl
à l'aide de RANK()
, vous pouvez utiliser une requête similaire à celle-ci (bien que des méthodes plus efficaces existent) :
<code class="language-sql">SELECT empname FROM (SELECT empname, RANK() OVER (ORDER BY sal DESC) as sal_rank FROM emptbl) WHERE sal_rank = n;</code>
Cela classe les salaires par ordre décroissant et filtre la ligne avec le classement souhaité.
Gestion des valeurs NULL :
Le traitement des valeurs NULL dépend de la clause ORDER BY
. Si les NULL sont classés en premier (ORDER BY sal NULLS FIRST
), ils recevront le classement le plus bas. S'ils sont commandés en dernier (ORDER BY sal NULLS LAST
), ils recevront le rang le plus élevé.
Exemple illustratif :
Examinons cela avec des exemples de données :
<code>DEPTNO EMPNAME SAL ------------------------------ 10 rrr 10000.00 11 nnn 20000.00 11 mmm 5000.00 12 kkk 30000.00 10 fff 40000.00 10 ddd 40000.00 10 bbb 50000.00 10 ccc 50000.00</code>
La requête :
<code class="language-sql">SELECT empname, deptno, sal, RANK() OVER (PARTITION BY deptno ORDER BY sal NULLS FIRST) as rnk, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal NULLS FIRST) as drnk_first, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal NULLS LAST) as drnk_last FROM emptbl;</code>
Produit des résultats montrant clairement la différence : rnk
démontre le saut de rang, tandis que drnk_first
et drnk_last
affichent un classement consécutif avec des NULL traités différemment. Le tableau de sortie représenterait visuellement les comportements de classement distincts. (Remarque : l'exemple suppose qu'une table nommée emptbl
existe avec les données fournies ; remplacez-la par le nom réel de votre table.)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!