NTH_VALUE |
Valeur n-ième |
| Oracle Database SQL |
Oracle version 11g Release 2 (version 11.2) ou supérieur |
Syntaxe
|
NTH_VALUE (measure_expr, n) [ FROM { FIRST | LAST } ][ { RESPECT | IGNORE } NULLS ] OVER (analytic_clause)
|
Paramètres
| Nom |
Description |
| measure_expr |
Ce paramètre permet d'indiquer l'expression ou la colonne dont on souhaite extraire la n-ième valeur dans la fenêtre définie. Il s'agit généralement d'une colonne numérique ou textuelle. |
| n |
Ce paramètre permet de spécifier la position (entier positif) de la valeur à retourner dans l'ensemble trié. Par exemple, n = 3 renvoie la 3? valeur selon l'ordre défini. |
| FROM FIRST/LAST |
Ce paramètre permet de déterminer si la valeur est comptée à partir du début (FIRST) ou de la fin (LAST) de la fenêtre. Par défaut, la fonction utilise FROM FIRST. |
| RESPECT NULLS |
Ce paramètre permet de prendre en compte les valeurs nulles lors du décompte des lignes. Cela signifie que les nulls seront comptés dans le positionnement des lignes. |
| IGNORE NULLS |
Ce paramètre permet d'ignorer les valeurs nulles dans le calcul de la n-ième valeur. Seules les lignes non nulles seront comptabilisées. |
| OVER (analytic_clause) |
Ce paramètre permet de définir la clause analytique spécifiant la partition des données, l'ordre des lignes, et éventuellement la plage ou les lignes de la fenêtre d'analyse. |
Description
Cette fonction permet de retourner la n-ième valeur d'une expression dans une fenêtre de résultats définie, selon l'ordre spécifié. Elle est utile pour récupérer des valeurs à des positions spécifiques dans une partition ou un groupe.
Remarques
- La fonction NTH_VALUE est une fonction analytique introduite dans Oracle 11gR2. Elle permet d'extraire la n-ième valeur d'une colonne dans une fenêtre d'analyse, ce qui
la rend très utile pour des rapports nécessitant des classements ou des comparaisons de rangs. Contrairement aux fonctions d'agrégation, elle ne réduit pas le nombre de
lignes.
- La clause OVER est obligatoire dans l'utilisation de NTH_VALUE, car elle définit le contexte d'analyse : partitionnement, ordre, et fenêtres. Sans cette clause, la
fonction ne peut pas déterminer dans quel cadre chercher la n-ième valeur. Cela signifie que NTH_VALUE ne peut pas être utilisée comme une simple fonction d'agrégation
globale.
- L'argument measure_expr peut être de n'importe quel type de données (texte, nombre, date,...). La fonction retournera une valeur du même type que cette expression.
C'est donc une fonction très flexible, adaptée à une grande variété de cas d'usage métier.
- Le paramètre n doit toujours être un entier positif, sinon une erreur sera levée. Par exemple, utiliser NTH_VALUE(salaire, 0) provoquera une erreur, car il n'existe
pas de "zéroième" valeur. Il faut donc s'assurer de la validité du paramètre, notamment s'il est dynamique.
- L'option FROM LAST est moins utilisée mais très puissante, car elle permet de chercher la n-ième valeur à partir de la fin de la fenêtre. Cela est utile dans des
analyses où l'on souhaite obtenir les dernières occurrences d'un ensemble ordonné.
- Le choix entre RESPECT NULLS et IGNORE NULLS a un impact majeur sur le résultat, surtout dans des colonnes où les données manquantes sont fréquentes. Avec IGNORE NULLS,
une valeur significative sera retournée même si des nulls précèdent sa position logique.
- Lorsqu'il n'y a pas suffisamment de lignes dans la fenêtre, la fonction retourne NULL. Par exemple, si vous demandez la 5? valeur mais qu'il n'y a que trois lignes dans
la partition, le résultat sera automatiquement nul, sans erreur levée.
- La fonction est particulièrement utile en combinaison avec des partitions, via PARTITION BY dans la clause OVER. Cela permet d'obtenir, par exemple, la 2e
vente la plus élevée par client ou la 3? date de commande par région, sans écrire de sous-requêtes complexes.
- L'ordre spécifié avec ORDER BY dans la clause OVER est indispensable, car c'est lui qui détermine l'arrangement des valeurs à analyser. Sans un ordre défini, Oracle ne
saura pas comment interpréter "n-ième valeur".
- Il est possible d'utiliser NTH_VALUE avec une clause ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, ce qui restreint la fenêtre à l'historique jusqu'à la ligne
courante. Cela permet d'obtenir des résultats progressifs ou cumulatifs.
- NTH_VALUE diffère de ROWNUM ou RANK dans sa logique, car elle ne numérote pas les lignes mais sélectionne une valeur précise à une position donnée. Elle ne change
pas la structure du jeu de données mais ajoute une information ciblée à chaque ligne.
- Cette fonction est utile dans les tableaux de bord ou les indicateurs de performance (KPIs), où l'on veut afficher des valeurs spécifiques comme "la 3e
meilleure vente", "le 2e score le plus bas",... Elle remplace avantageusement des sous-requêtes imbriquées plus complexes.
Dernière mise à jour : Dimanche, le 29 Juin 2025