Maison > base de données > tutoriel mysql > Quelle est la différence entre Rank () et dense_rank () dans Oracle SQL?

Quelle est la différence entre Rank () et dense_rank () dans Oracle SQL?

DDD
Libérer: 2025-01-25 00:04:14
original
806 Les gens l'ont consulté

What's the Difference Between RANK() and DENSE_RANK() in Oracle SQL?

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal