4th Jul 2022 7 minutes de lecture Qu'est-ce que la fonction RANK() en SQL, et comment l'utiliser ? Kateryna Koidan sql apprendre sql rank pratique en ligne fonctions de fenêtrage Table des matières Introduction à la fonction RANK() Classement de base Classement au sein de différents groupes Autres fonctions de classement en SQL Il est temps de pratiquer les fonctions de classement ! Qui sont vos 10 meilleurs clients ? Quels sont les employés les plus performants de chaque service ? Pour répondre à ce genre de questions, vous devez classer les résultats de votre requête SQL. Voyons comment la fonction RANK() aide à classer les résultats en SQL. Il existe de nombreux cas d'utilisation dans lesquels vous pouvez avoir besoin de classer des lignes en SQL. Vous pouvez par exemple classer les clients en fonction du volume des ventes, les étudiants en fonction de leurs résultats aux examens, les actifs d'une entreprise en fonction de leur valeur actuelle, les départements en fonction du nombre d'employés ou les utilisateurs en fonction de leur date d'enregistrement. Le classement est un outil important et courant dans l'analyse des données. Dans ce tutoriel, je vais fournir des explications détaillées sur la façon de classer des lignes en SQL. Introduction à la fonction RANK() La fonction RANK() est l'une des fonctions fenêtre de SQL. Les fonctions fenêtres examinent une partie des données et calculent les résultats pour cette partie. La fonction RANK(), en particulier, attribue un rang à chaque ligne en fonction d'une colonne fournie. RANK() est incluse dans l'instruction SELECT avec la syntaxe suivante : RANK() OVER (ORDER BY column ASC|DESC) En gros, vous ajoutez une autre colonne à votre ensemble de résultats. Cette colonne comprend le rang de chaque enregistrement en fonction de l'ordre spécifié après le mot-clé ORDER BY. Cela implique de spécifier (1) la colonne à utiliser pour trier les rangs et (2) si l'ordre doit être croissant ou décroissant. La première ligne obtient le rang 1, et les lignes suivantes obtiennent des rangs supérieurs. Si des lignes ont la même valeur dans la colonne utilisée pour le tri, elles sont classées de la même façon. La fonction RANK() laisse des vides dans de tels cas. Par exemple, si les première et deuxième lignes ont la même valeur dans la colonne fournie, elles obtiennent toutes deux le rang 1. Ensuite, la troisième ligne obtient le rang 3 (c'est-à-dire que le rang 2 sera manquant). Pour vous familiariser avec la fonction RANK(), consultez notre cours interactif Fonctions de fenêtrage interactif. Il couvre également d'autres fonctions de classement qui ont des approches différentes pour traiter les mêmes valeurs dans la colonne fournie. Voyons maintenant la fonction RANK() en action. Classement de base Pour voir comment la fonction RANK() fonctionne en pratique, nous allons prendre un exemple. Imaginons que nous ayons une équipe de développeurs. Nous voulons les classer en fonction de leur expérience. Voici le tableau avec lequel nous commençons : developers idfirst_namelast_namelevelyears_experience 10JackDavisjunior1 11HelenBrownjunior0 12KateWilliamssenior4 13AlexMillersenior8 14SophiaMooremid-level3 15NickJacksonmid-level3 16StevenMartinjunior2 17MeganStevensjunior1 18JohnJonessenior5 19MaxWebermid-level4 Maintenant, notre tâche est d'afficher le prénom, le nom, le niveau d'ancienneté, les années d'expérience et le rang des développeurs. Nous voulons que le développeur le plus expérimenté obtienne le rang 1. Voici notre requête SQL ainsi que le jeu de résultats : SELECT first_name, last_name, level, years_experience, RANK() OVER (ORDER BY years_experience DESC) FROM developers; first_namelast_namelevelyears_experiencerank AlexMillersenior81 JohnJonessenior52 MaxWebermid-level43 KateWilliamssenior43 NickJacksonmid-level35 SophiaMooremid-level35 StevenMartinjunior27 MeganStevensjunior18 JackDavisjunior18 HelenBrownjunior010 Pour classer les développeurs en fonction de leur expérience, nous avons inclus le champ suivant dans l'instruction SELECT: RANK() OVER (ORDER BY years_experience DESC) Nous définissons l'ordre après la clause ORDER BY en spécifiant la colonne à utiliser pour le tri (years_experience) et l'ordre (décroissant). Ensuite, nous classons les développeurs en fonction de cet ordre. Nous voyons que le développeur avec 8 ans d'expérience obtient le rang 1, le développeur avec 5 ans d'expérience obtient le rang 2, et les deux développeurs avec 4 ans d'expérience obtiennent tous deux le rang 3. Notez que la fonction RANK() laisse un vide ici, et les développeurs suivants obtiennent le rang 5 (c'est-à-dire que le rang 4 est manquant). Vous avez maintenant une idée du fonctionnement de la fonction RANK(), notamment de la manière dont elle traite les mêmes valeurs dans la colonne utilisée pour le tri. Vous trouverez d'autres cas d'utilisation dans ce guide complet du classement des lignes en SQL. Nous allons maintenant passer à des exemples plus avancés. Classement au sein de différents groupes Dans notre premier exemple, nous avons classé l'ensemble des résultats. Maintenant, disons que nous voulons avoir un classement distinct pour chacun des niveaux d'ancienneté (c'est-à-dire junior, moyen et senior). Avec la fonction RANK() de SQL, nous pouvons le faire en ajoutant le mot-clé PARTITION BY et en spécifiant la colonne à utiliser pour regrouper les enregistrements. Voici notre requête SQL : SELECT first_name, last_name, level, years_experience, RANK() OVER (PARTITION BY level ORDER BY years_experience DESC) FROM developers; Dans la clause OVER(), nous définissons d'abord comment regrouper les enregistrements (en utilisant la colonne level ), puis comment ordonner les enregistrements au sein de ces groupes (en fonction des années d'expérience, en commençant par le développeur le plus expérimenté). Voici le tableau qui en résulte : first_namelast_namelevelyears_experiencerank StevenMartinjunior21 JackDavisjunior12 MeganStevensjunior12 HelenBrownjunior04 MaxWebermid-level41 NickJacksonmid-level32 SophiaMooremid-level32 AlexMillersenior81 JohnJonessenior52 KateWilliamssenior43 Remarquez que nous avons des classements distincts pour les niveaux junior, moyen et senior. Pourtant, le développeur le plus expérimenté de chaque groupe est classé au rang 1, et les développeurs moins expérimentés sont mieux classés. Notez également que si Kate Williams et Max Weber ont les mêmes 4 années d'expérience, Max obtient le rang 1 en tant que développeur de niveau intermédiaire le plus expérimenté, tandis que Kate obtient le rang 3 en tant que développeur senior le moins expérimenté. Maintenant que vous connaissez le fonctionnement de PARTITION BY, il est temps de découvrir les autres fonctions de classement. Autres fonctions de classement en SQL Pour classer des lignes en SQL, vous pouvez également utiliser les fonctions DENSE_RANK() et ROW_NUMBER(). La différence réside dans la manière dont ces fonctions traitent les mêmes valeurs. Comme nous l'avons appris précédemment, la fonction RANK() donne le même rang aux enregistrements ayant la même valeur et laisse un écart pour tenir compte de ces enregistrements. En revanche : la fonction DENSE_RANK() ne laisse pas d'écart ; la fonction ROW_NUMBER() classe différemment tous les enregistrements, même si les valeurs sont les mêmes. Il est plus facile de comprendre cette différence à l'aide d'un exemple. Revenons donc à notre premier cas d'utilisation dans lequel nous avons classé l'ensemble des résultats. Mais, cette fois, nous allons également utiliser DENSE_RANK() et ROW_NUMBER(): SELECT first_name, last_name, level, years_experience, RANK() OVER (ORDER BY years_experience DESC), DENSE_RANK() OVER (ORDER BY years_experience DESC), ROW_NUMBER() OVER (ORDER BY years_experience DESC) FROM developers; first_namelast_namelevelyears_experiencerankdense_rankrow_number AlexMillersenior8111 JohnJonessenior5222 MaxWebermid-level4333 KateWilliamssenior4334 NickJacksonmid-level3545 SophiaMooremid-level3546 StevenMartinjunior2757 MeganStevensjunior1868 JackDavisjunior1869 HelenBrownjunior010710 Comme la fonction RANK(), la fonction DENSE_RANK() donne le même rang aux développeurs ayant les mêmes années d'expérience (par exemple, le rang 3 à Kate Williams et Max Weber). Cependant, le rang suivant dans la colonne dense_rank est 4, ce qui ne laisse aucun vide dans le classement. D'autre part, la fonction ROW_NUMBER() attribue un numéro différent à tous les développeurs, y compris à ceux qui ont les mêmes années d'expérience. Alors, pourquoi Max obtient-il le rang 3 et Kate le rang 4 ? Il s'agit d'un choix arbitraire, et vous ne savez jamais lequel des enregistrements ayant la même valeur se verra attribuer un rang supérieur. Maintenant que vous connaissez la différence entre les fonctions de classement, vous pouvez décider laquelle est la plus adaptée à vos cas d'utilisation. Si vous n'êtes pas sûr, voyez d'autres exemples des fonctions RANK(), DENSE_RANK() et ROW_NUMBER() dans cet article de présentation. Il est temps de pratiquer les fonctions de classement ! Les fonctions de classement font partie des outils les plus couramment utilisés par les analystes de données. Vous devez donc vous sentir à l'aise avec le classement en SQL. Et la confiance vient avec la pratique. Consultez ce Fonctions de fenêtrage qui comprend 218 exercices interactifs couvrant les fonctions de classement, les fonctions analytiques, les calculs statistiques avancés avec différents cadres de fenêtre, etc. Vous pouvez en savoir plus sur ce cours dans cet article. Et voici un bonus : cette fiche de deux pages sur SQL Fonctions de fenêtrage vous aidera à vous entraîner au classement et à d'autres fonctions de fenêtre. Merci de votre lecture et bon apprentissage ! Tags: sql apprendre sql rank pratique en ligne fonctions de fenêtrage