LAST |
Dernier |
|---|---|
| Oracle Database SQL | Oracle Database 9i ou supérieure |
Syntaxe
| aggregate_function KEEP (DENSE_RANK LAST ORDER BY expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] [, expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] ]... ) [ OVER ( [query_partition_clause] ) ] |
Paramètres
| Nom | Description |
|---|---|
| aggregate_function | Ce paramètre permet de spécifier la fonction d'agrégation (comme MAX, MIN, SUM, AVG,...) dont la valeur sera filtrée pour ne conserver que celle correspondant au dernier rang. |
| KEEP | Ce paramètre permet de filtrer le résultat de l'agrégation en ne gardant que la ligne correspondant à un rang spécifique, ici le dernier selon le classement défini par DENSE_RANK. |
| DENSE_RANK | Ce paramètre permet de conserver toutes les lignes ayant le même rang sans sauter de valeurs, ce qui est utile pour maintenir la densité des résultats ordonnés. |
| LAST | Ce paramètre permet de désigner que l'on souhaite garder la dernière valeur dans l'ordre spécifié. Il s'oppose à FIRST, qui garde la première. |
| ORDER BY expr | Ce paramètre permet de définir l'ordre selon lequel les lignes seront classées pour déterminer la dernière valeur. |
| OVER | Ce paramètre permet de transformer la fonction en fonction analytique, c'est-à-dire d'appliquer l'agrégation sur une fenêtre définie plutôt que sur l'ensemble de la table. |
| query_partition_clause | Ce paramètre permet de partitionner les données en groupes distincts, chaque groupe étant traité séparément pour le calcul de la dernière valeur selon l'ordre établi. |
Description
Cette fonction permet de retourner la dernière valeur d'un ensemble ordonné, souvent utilisée dans un contexte analytique avec KEEP (DENSE_RANK LAST ORDER BY ...). Elle permet d'extraire une valeur finale selon un critère défini.
Remarques
- Fonction d'agrégation conditionnelle avancée : La fonction LAST avec KEEP (DENSE_RANK LAST ORDER BY ...) permet de cibler précisément la dernière valeur dans un ordre spécifique, tout en utilisant une fonction d'agrégation. Contrairement aux fonctions MAX ou MIN simples, cette approche permet de retourner non pas le maximum ou le minimum d'un champ, mais la valeur d'un autre champ associée au dernier rang d'un classement défini.
- Utilisation combinée avec DENSE_RANK : Le mécanisme repose sur le classement DENSE_RANK, qui classe les lignes sans sauter de rangs lorsqu'il y a des ex-aequo. Cela signifie que plusieurs lignes peuvent être considérées comme ayant le même rang "dernier", ce qui permet d'avoir une agrégation stable dans des cas où plusieurs valeurs partagent la même priorité finale.
- Alternative élégante aux sous-requêtes : Cette fonction permet de remplacer des sous-requêtes ou des jointures complexes que l'on écrivait auparavant pour récupérer la dernière valeur dans un groupe. Elle réduit considérablement la complexité du code SQL tout en améliorant sa lisibilité et ses performances.
- Souplesse dans le choix de la colonne extraite : Grâce à la combinaison d'une fonction d'agrégation (MAX, MIN,...) et d'un tri (ORDER BY), on peut extraire la valeur d'une colonne différente de celle utilisée pour le classement. Par exemple, on peut extraire le prix associé au dernier date_achat, ce qui n'est pas possible avec une simple fonction d'agrégation classique.
- Importance de l'ordre de tri : Le mot clef ORDER BY détermine le critère utilisé pour identifier la dernière ligne. En fonction du tri ASC ou DESC, et de la gestion des NULLS, le résultat retourné par la fonction peut varier significativement. Il est donc essentiel de bien définir l'ordre selon le contexte métier.
- Gestion explicite des valeurs NULL : La syntaxe permet d'ajouter NULLS FIRST ou NULLS LAST pour indiquer comment classer les valeurs nulles dans l'ordre. Cela est crucial, car sans ce contrôle explicite, une valeur NULL peut apparaître en première ou dernière position par défaut, et fausser le résultat retourné.
- Support des partitions analytiques : En combinant la clause OVER avec query_partition_clause, on peut appliquer cette fonction à des sous-ensembles de données (par exemple par client, produit, ou pays), permettant ainsi de récupérer la dernière valeur dans chaque groupe sans écrire plusieurs requêtes distinctes.
- Compatible avec de nombreuses fonctions d'agrégation : La clause KEEP ... LAST peut être utilisée avec plusieurs fonctions comme MAX, MIN, SUM, AVG, COUNT, mais elle est surtout utile avec MAX ou MIN pour filtrer des résultats sur des rangs spécifiques, comme la dernière date ou la dernière note attribuée à un étudiant.
- Performances généralement bonnes : Cette syntaxe est bien optimisée dans Oracle à partir de la version 9i. Elle peut, dans de nombreux cas, éviter des opérations coûteuses de type ROWNUM, RANK() ou JOIN imbriqués, tout en conservant une bonne expressivité pour des analyses complexes.
- Compréhension facilitée pour les analystes : La syntaxe peut paraître complexe au départ, mais elle est en réalité très lisible une fois maîtrisée. Elle décrit explicitement ce que l'on veut : prendre une fonction d'agrégation et ne garder que la valeur associée au dernier élément dans un ordre défini, ce qui correspond bien à une logique métier.
- Résultat unique par groupe : La fonction retourne un seul résultat par groupe, même si plusieurs lignes partagent le même rang final. Dans ce cas, l'agrégation choisira selon la logique de la fonction utilisée (par exemple, le maximum parmi les derniers en cas d'ex-aequo).
- Excellente combinaison avec d'autres fonctions analytiques : La clause KEEP (DENSE_RANK LAST ...) peut être utilisée dans des requêtes plus larges incluant d'autres fonctions analytiques comme ROW_NUMBER, LAG, ou FIRST_VALUE, ce qui en fait un outil très souple pour construire des tableaux de bord, rapports, ou analyses complexes.
Dernière mise à jour : Dimanche, le 29 Juin 2025