DENSE_RANK |
Densité du rang |
|---|---|
| BigQuery | |
Syntaxe
| DENSE_RANK() |
Description
Cette fonction permet de demander le rang ordinal de chaque enregistrement de la fenêtre de requête.
Remarques
- Classement sans "trous" dans la séquence de rangs : La fonction DENSE_RANK() attribue un rang à chaque ligne en fonction d'un ordre défini, mais contrairement à RANK(), elle ne saute pas de numéro en cas d'égalité. Par exemple, si deux lignes partagent le rang 1, la suivante aura le rang 2 (et non 3), ce qui rend les classements plus compacts et continus.
- Nécessite une clause OVER(ORDER BY ...) pour fonctionner : DENSE_RANK() est une fonction analytique qui doit être utilisée avec une clause OVER(), généralement accompagnée d'un ORDER BY pour définir la logique de classement. Sans cet ordre explicite, la fonction ne sait pas comment déterminer la position relative des lignes.
- Utile dans les classements multi-lignes à égalité : Lorsque plusieurs lignes ont exactement les mêmes valeurs de classement (par exemple, plusieurs produits avec le même score de vente), DENSE_RANK() leur donne le même rang, ce qui reflète plus fidèlement la réalité d'un classement où plusieurs éléments occupent une position partagée.
- Pratique pour les extractions top-N avec égalité : On peut utiliser DENSE_RANK() pour extraire tous les enregistrements dans le top-N, y compris ceux à égalité. Par exemple, un filtre WHERE DENSE_RANK() OVER(ORDER BY score DESC) <= 3 retournera tous les éléments occupant les trois premiers rangs, même s'il y a des ex-aequo.
- Diffère de ROW_NUMBER() qui ne gère pas les égalités : Contrairement à ROW_NUMBER() assignant un rang unique à chaque ligne, DENSE_RANK() donne le même rang aux lignes identiques selon le critère d'ordre. Cela permet d'éviter les classements artificiellement forcés, notamment dans les jeux de données où les valeurs sont souvent dupliquées.
- Compatible avec des partitions pour des classements indépendants : La clause PARTITION BY dans l'instruction OVER() permet d'utiliser DENSE_RANK() pour établir des classements séparés par groupe. Par exemple, on peut classer les meilleurs vendeurs par région, chaque région ayant son propre classement local.
- Facilite la création de sous-totaux ou regroupements hiérarchiques : En utilisant DENSE_RANK() pour identifier des groupes de valeurs similaires, il devient possible de construire des regroupements hiérarchiques cohérents. Cela peut être utile pour générer des rapports où les rangs doivent être continus dans chaque section logique.
- Peut impacter les performances sur de grands volumes : Bien que puissante, l'utilisation de DENSE_RANK() avec PARTITION BY et ORDER BY peut être coûteuse en temps de traitement sur de très grands ensembles de données. Il est recommandé d'optimiser l'ordre de tri et les partitions pour limiter les calculs inutiles.
Dernière mise à jour : Jeudi, le 18 Juin 2020