Oracle Rank () et dense_rank (): une analyse comparative des fonctions de fenêtre
Oracle RANK()
et DENSE_RANK()
sont des fonctions de fenêtre utilisées pour attribuer des rangs aux lignes dans une partition spécifiée. Bien que les deux atteignent des objectifs similaires, leur traitement des liens et des valeurs nulles diffère considérablement.
RANK()
Fonction
RANK()
Attribue des classements en fonction de la commande spécifiée. Surtout, il attribue le classement même aux lignes attachées, puis sauts les classements . Par exemple, si trois lignes sont à égalité pour la deuxième place, ils recevront tous un rang de 2, et le prochain rang sera de 5.
DENSE_RANK()
Fonction
Contrairement à RANK()
, DENSE_RANK()
attribue des rangs consécutifs sans lacunes, même avec des liens. Toutes les lignes liées reçoivent le même rang et le rang suivant suit immédiatement. Il n'y a pas de rangs sautés.
Récupération du nème salaire le plus élevé
Pour identifier le nième salaire le plus élevé du tableau emptbl
, vous pouvez utiliser RANK()
ou DENSE_RANK()
dans la clause OVER()
:
<code class="language-sql">SELECT empname, sal FROM ( SELECT empname, sal, RANK() OVER (ORDER BY sal DESC) AS rnk -- Note: ORDER BY sal DESC for nth highest FROM emptbl ) WHERE rnk = n;</code>
Gestion des valeurs nuls
Le traitement des valeurs nulles par les deux fonctions est déterminé par la clause ORDER BY
. Si NULLS FIRST
est spécifié, les nulls sont classés avant les valeurs non nuls; Si NULLS LAST
, ils sont classés après.
Exemple illustratif
Examinons le script suivant:
<code class="language-sql">WITH q AS ( SELECT 10 AS DEPTNO, 'rrr' AS EMPNAME, 10000.00 AS SAL FROM DUAL UNION ALL SELECT 11, 'nnn', 20000.00 FROM DUAL UNION ALL SELECT 11, 'mmm', 5000.00 FROM DUAL UNION ALL SELECT 12, 'kkk', 30000 FROM DUAL UNION ALL SELECT 10, 'fff', 40000 FROM DUAL UNION ALL SELECT 10, 'ddd', 40000 FROM DUAL UNION ALL SELECT 10, 'bbb', 50000 FROM DUAL UNION ALL SELECT 10, 'xxx', NULL FROM DUAL UNION ALL SELECT 10, 'ccc', 50000 FROM DUAL ) SELECT EMPNAME, DEPTNO, SAL, RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL NULLS FIRST) AS R, DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL NULLS FIRST) AS DR1, DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL NULLS LAST) AS DR2 FROM q;</code>
Les résultats démontrent clairement le comportement contrastant de RANK()
et DENSE_RANK()
lors de la gestion des valeurs nulles, selon la spécification NULLS FIRST
ou NULLS LAST
dans la clause ORDER BY
. Cet exemple met en évidence l'importance de comprendre ces nuances lors du choix de la fonction de classement appropriée pour vos besoins spécifiques.
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!