
🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.
Fonction LEAD Oracle SQL : Accéder aux Lignes Suivantes
La fonction analytique LEAD Oracle SQL permet d’accéder à la valeur d’une ligne suivante dans un ensemble de résultats, sans effectuer de jointure complexe. Utilisée dans les rapports financiers, le suivi de performances ou l’analyse de tendances, LEAD simplifie considérablement les requêtes qui nécessitent une comparaison entre lignes consécutives. C’est un outil incontournable pour tout développeur Oracle travaillant avec des données séquentielles.
Définition et utilisation de LEAD en Oracle SQL
La fonction LEAD est une fonction analytique Oracle (aussi appelée fonction de fenêtrage) qui retourne la valeur d’une colonne issue d’une ligne située en avance par rapport à la ligne courante, selon un ordre défini. Elle fait partie de la famille des fonctions LAG/LEAD, introduites pour éviter les auto-jointures coûteuses en performance.
Cas d’usage en entreprise
- Finance : Comparer le chiffre d’affaires d’un mois avec celui du mois suivant pour calculer une variation.
- RH : Identifier la date de la prochaine augmentation de salaire d’un employé.
- Logistique : Calculer le délai entre deux expéditions successives d’un même fournisseur.
- E-commerce : Analyser l’enchaînement des actions d’un utilisateur dans un tunnel de conversion.
Contrairement à une sous-requête corrélée ou à une auto-jointure, LEAD est traitée en un seul passage sur les données, ce qui améliore nettement les performances sur de grands volumes.
Syntaxe complète de LEAD Oracle SQL
LEAD (expression [, offset [, default]])
OVER ([PARTITION BY partition_expression, ...]
ORDER BY sort_expression [ASC | DESC], ...)
Explication des paramètres
| Paramètre | Obligatoire | Description |
|---|---|---|
expression | Oui | La colonne ou expression dont on souhaite récupérer la valeur dans la ligne suivante. |
offset | Non (défaut : 1) | Nombre de lignes en avance à parcourir. 1 = ligne immédiatement suivante, 2 = deux lignes en avance, etc. |
default | Non (défaut : NULL) | Valeur retournée si aucune ligne suivante n’existe (fin de partition). Permet d’éviter les valeurs NULL non souhaitées. |
PARTITION BY | Non | Divise le jeu de résultats en groupes indépendants (ex. : par département, par région). |
ORDER BY | Oui | Définit l’ordre de lecture des lignes dans chaque partition. Crucial pour le bon fonctionnement de la fonction. |
⚠️ Important : La clause
ORDER BYdansOVER()est obligatoire avecLEAD. Sans ordre défini, le résultat serait non déterministe.
Exemples pratiques de LEAD en Oracle SQL
Exemple 1 – Comparer les ventes mensuelles d’une même année
Contexte métier : Une entreprise souhaite afficher, pour chaque mois, le chiffre d’affaires actuel et celui du mois suivant afin de calculer une tendance.
-- Table : VENTES_MENSUELLES (MOIS DATE, MONTANT NUMBER)
-- Objectif : Afficher le CA du mois courant et du mois suivant
SELECT
MOIS,
MONTANT AS ca_courant,
LEAD(MONTANT, 1, 0)
OVER (ORDER BY MOIS) AS ca_mois_suivant,
LEAD(MONTANT, 1, 0)
OVER (ORDER BY MOIS) - MONTANT AS variation
FROM
VENTES_MENSUELLES
ORDER BY
MOIS;
Explication :
LEAD(MONTANT, 1, 0)récupère le montant de la ligne suivante. Si la ligne n’existe pas (dernier mois), elle retourne0grâce au paramètre default.- La colonne
variationcalcule la différence entre le mois suivant et le mois actuel, permettant d’identifier les mois en hausse ou en baisse. - Aucune jointure n’est nécessaire : une seule lecture de la table suffit.
Exemple 2 – Analyser les promotions des employés par département
Contexte métier : Le service RH souhaite connaître, pour chaque employé, la date de sa prochaine prise de poste au sein du même département, triée par date d’embauche.
-- Table : EMPLOYES (NOM VARCHAR2, DEPARTEMENT VARCHAR2, DATE_EMBAUCHE DATE, POSTE VARCHAR2)
-- Objectif : Trouver le prochain poste occupé dans le même département
SELECT
NOM,
DEPARTEMENT,
DATE_EMBAUCHE,
POSTE AS poste_actuel,
LEAD(POSTE, 1, 'Aucun')
OVER (PARTITION BY DEPARTEMENT
ORDER BY DATE_EMBAUCHE) AS prochain_poste,
LEAD(DATE_EMBAUCHE, 1)
OVER (PARTITION BY DEPARTEMENT
ORDER BY DATE_EMBAUCHE) AS date_prochain_poste
FROM
EMPLOYES
ORDER BY
DEPARTEMENT, DATE_EMBAUCHE;
Explication :
PARTITION BY DEPARTEMENTisole le calcul pour chaque département : la fonction repart à zéro à chaque changement de département.LEAD(POSTE, 1, 'Aucun')affiche'Aucun'pour le dernier employé embauché dans chaque département (pas de successeur connu).- On peut ainsi identifier des « gaps » de recrutement ou planifier les successions internes.
Erreurs courantes avec LEAD Oracle SQL
Erreur : Utiliser LEAD dans une clause WHERE
Une erreur très fréquente consiste à vouloir filtrer directement sur le résultat d’une fonction analytique dans la clause WHERE :
-- ❌ Code incorrect : provoque une erreur ORA-30483
SELECT NOM, MONTANT
FROM VENTES_MENSUELLES
WHERE LEAD(MONTANT, 1) OVER (ORDER BY MOIS) > 5000;
Message d’erreur Oracle : ORA-30483: window functions are not allowed here
Solution : Encapsuler la requête dans une sous-requête ou utiliser une CTE (WITH), puis filtrer dans la requête externe :
-- ✅ Code correct : utilisation d'une sous-requête
SELECT NOM, MONTANT, CA_SUIVANT
FROM (
SELECT
NOM,
MONTANT,
LEAD(MONTANT, 1) OVER (ORDER BY MOIS) AS ca_suivant
FROM VENTES_MENSUELLES
)
WHERE CA_SUIVANT > 5000;
Cette règle s’applique à toutes les fonctions analytiques Oracle : elles ne peuvent jamais apparaître directement dans une clause WHERE, HAVING ou GROUP BY.
Résumé de la fonction LEAD Oracle SQL
| Point clé | Détail |
|---|---|
| Type | Fonction analytique (fenêtrage) |
| Rôle | Accéder à la valeur d’une ligne suivante |
| Paramètre offset | Nombre de lignes en avance (défaut : 1) |
| Paramètre default | Valeur si aucune ligne suivante (défaut : NULL) |
| PARTITION BY | Facultatif, segmente le calcul par groupe |
| ORDER BY | Obligatoire dans la clause OVER() |
| Erreur fréquente | Usage dans WHERE → ORA-30483 |
| Performance | Meilleure qu’une auto-jointure sur grands volumes |
Bonnes pratiques Oracle
- Toujours renseigner le paramètre
defaultpour éviter les valeursNULLimprévues en fin de partition, surtout si la colonne est utilisée dans un calcul mathématique (risque de résultatNULLen cascade). - Associer
LEADà unORDER BYdéterministe (sur une clé unique ou une combinaison de colonnes garantissant l’unicité de l’ordre) pour obtenir des résultats stables et reproductibles entre deux exécutions.
Aller plus loin
Pour approfondir votre maîtrise des fonctions analytiques Oracle et compléter votre apprentissage de LEAD, voici trois sujets étroitement liés à explorer :
- Fonction LAG Oracle SQL – L’opposé de LEAD : accédez aux valeurs des lignes précédentes pour calculer des évolutions historiques.
- Fonctions analytiques Oracle SQL – Découvrez l’ensemble de l’écosystème des fonctions de fenêtrage :
ROW_NUMBER,RANK,DENSE_RANK,SUManalytique, etc. - Clause OVER et PARTITION BY Oracle – Maîtrisez la syntaxe du fenêtrage pour contrôler précisément le périmètre de calcul de vos fonctions analytiques.
