DENSE_RANK |
Densité du rang |
|---|---|
| Oracle Database SQL | Oracle 9i ou supérieure |
Syntaxe
| dense_rank(expression1,...,expressionN) |
Paramètres
| Nom | Description |
|---|---|
| expression1 | Ce paramètre permet d'indiquer la première expression correspondant au nombre à traiter |
| ...,expressionN | Ces paramètres permettent d'indiquer les autres expressions correspondant au nombre à traiter |
Description
Cette fonction retourne le rang d'un enregistrement contenu dans un groupe d'enregistrement.
Remarques
- Rang sans saut en cas d'égalité : La fonction DENSE_RANK permet d'attribuer des rangs consécutifs aux lignes d'un groupe, même en cas d'ex-aequo. Contrairement à RANK, elle ne saute pas de valeur de rang après une égalité. Par exemple, si deux lignes sont classées au rang 1, la suivante aura le rang 2, et non 3. Cela permet une représentation plus compacte et continue des positions. C'est particulièrement utile dans les analyses où le nombre effectif de groupes est important. Ainsi, DENSE_RANK reflète mieux la densité réelle des valeurs distinctes. Ce comportement peut réduire les distorsions dans des analyses ordinales.
- Requiert impérativement une clause ORDER BY : La fonction DENSE_RANK doit être utilisée avec la clause ORDER BY dans une clause OVER(). Sans cette clause, Oracle renverra une erreur de syntaxe. L'ordre spécifié influence directement la distribution des rangs. Le tri peut être basé sur une ou plusieurs colonnes. L'utilisateur peut choisir un ordre croissant (ASC) ou décroissant (DESC). La précision de l'ordre est cruciale car elle conditionne l'ensemble du classement. Sans définition claire, les résultats peuvent être incohérents ou imprévisibles.
- Utilisation fréquente dans les analyses top-N : DENSE_RANK est souvent utilisée pour extraire les n premiers éléments d'un groupe, notamment dans des sous-requêtes de classement. Par exemple, elle est idéale pour identifier les 3 meilleurs vendeurs dans chaque région. Elle évite de supprimer des cas d'ex-aequo injustement. Cette fonction est donc plus juste que ROWNUM dans les classements analytiques. Combinée avec PARTITION BY, elle permet de restreindre l'analyse à des sous-ensembles cohérents. Cela la rend incontournable dans les requêtes décisionnelles complexes.
- Compatible avec la clause PARTITION BY : Dans une clause OVER(), DENSE_RANK accepte une clause PARTITION BY pour segmenter les résultats par groupes logiques. Cela permet de recalculer les rangs de manière indépendante pour chaque partition. Par exemple, on peut obtenir un classement par département, tout en conservant un classement distinct par produit. Cela augmente la granularité des analyses. La segmentation améliore aussi les performances dans des contextes massivement parallèles. C'est une fonction clé pour les calculs statistiques par groupe.
- Pas affectée par les NULLs dans l'ordre : Quand des colonnes contenant des valeurs NULL sont utilisées dans l'ORDER BY, Oracle place les valeurs NULL en dernière position par défaut (ou en premier selon la clause explicite NULLS FIRST ou LAST). DENSE_RANK respecte cette hiérarchie dans le classement. Les NULL sont donc intégrés comme valeur de tri et peuvent affecter la position d'une ligne. Toutefois, plusieurs NULL sont considérés comme identiques, ce qui leur donne le même rang. Il est donc important d'être explicite sur le traitement des valeurs NULL dans le tri.
- Ne retourne pas directement le meilleur ou pire pointage : Contrairement à une agrégation classique comme MAX() ou MIN(), DENSE_RANK n'identifie pas une valeur extrême. Elle retourne la position relative dans un ordre défini. Il faut souvent l'envelopper dans une sous-requête ou l'utiliser avec une clause WHERE pour extraire, par exemple, les lignes avec DENSE_RANK = 1. Cela permet plus de souplesse, mais nécessite une syntaxe plus élaborée. Cette caractéristique en fait une fonction d'analyse plus que de résumé.
- Parfaitement adaptée à l'analyse des ex-aequo : La gestion des égalités est l'une des forces majeures de DENSE_RANK. Contrairement à ROW_NUMBER, distinguant chaque ligne indépendamment, DENSE_RANK attribue le même rang aux valeurs identiques. Cela permet de repérer les groupes naturels de performances égales ou d'observer des regroupements de résultats équivalents. Cette précision est essentielle dans les tableaux de classement ou les études comparatives. Elle améliore la fidélité de l'analyse en cas de forte concentration de valeurs.
- Peut être combinée avec des agrégats analytiques : DENSE_RANK est souvent utilisée dans des analyses avancées combinées avec des fonctions comme SUM() OVER(...) ou AVG() OVER(...). Elle permet alors de repérer les groupes en tête de classement tout en affichant les moyennes ou totaux cumulés. Cette capacité à s'imbriquer dans des requêtes analytiques complexes en fait un outil très flexible. Elle est aussi compatible avec les vues matérialisées, les CTE (WITH) et les requêtes en ligne (inline views). C'est un composant fréquent des tableaux de bord BI.
- Indépendante du nombre total d'enregistrements : Le rang retourné par DENSE_RANK dépend uniquement de l'ordre des valeurs et non du volume total des lignes. Cela signifie que même dans un ensemble de données massif, seules les valeurs distinctes influencent le résultat. Ce comportement est utile pour identifier la position relative d'un élément sans se préoccuper de la taille totale du jeu de données. Il réduit les effets de bord dans les jeux hétérogènes. Cela facilite également les comparaisons intergroupes.
- Résultat toujours numérique et séquentiel : Le type de retour de DENSE_RANK est un entier positif (NUMBER) croissant, à partir de 1. Aucune ligne ne peut avoir un rang zéro. Cela le rend facilement utilisable dans les clauses WHERE ou pour des affichages ordonnés. Il peut également être converti en texte (TO_CHAR) pour formatage sans altération de sens. Ce format standardisé améliore la lisibilité et l'intégration dans des processus de reporting automatisés. Il s'adapte bien aux interfaces graphiques.
- Particulièrement efficace avec les index triés : Lorsque l'ORDER BY utilisé par DENSE_RANK correspond à un index (notamment sur des colonnes triées ou partitionnées), Oracle peut optimiser l'évaluation du rang. Cela réduit la charge en mémoire et améliore les performances d'exécution. Cette synergie rend la fonction précieuse dans des environnements exigeants. L'optimiseur Oracle est capable d'exploiter cette structure pour accélérer l'évaluation analytique. Elle s'inscrit bien dans une stratégie de tuning SQL.
- Utile dans les systèmes de recommandation ou pointage : La fonction DENSE_RANK est idéale dans des systèmes de notation ou de recommandation où plusieurs éléments peuvent avoir le même score. Elle permet de classer les éléments selon des critères multiples, tout en respectant les égalités. On la retrouve aussi dans des algorithmes de ranking pour moteurs de recherche internes, pointages de candidats ou classement de produits. Son comportement cohérent garantit une expérience utilisateur plus équitable. Elle s'intègre naturellement dans les logiques métiers de priorisation.
Voir également
Article - Les géants de l'informatique - Oracle
Dernière mise à jour : Lundi, le 11 mai 2015