LEAD Oracle SQL : Fonction Analytique Expliquée

Apprenez à utiliser la fonction LEAD en Oracle SQL : syntaxe, exemples pratiques et erreurs courantes. Accédez aux lignes suivantes dans vos requêtes.

Illustration du tutoriel SQL Oracle : LEAD Oracle SQL : Fonction Analytique Expliquée

Publicité

🧪 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ètreObligatoireDescription
expressionOuiLa colonne ou expression dont on souhaite récupérer la valeur dans la ligne suivante.
offsetNon (défaut : 1)Nombre de lignes en avance à parcourir. 1 = ligne immédiatement suivante, 2 = deux lignes en avance, etc.
defaultNon (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 BYNonDivise le jeu de résultats en groupes indépendants (ex. : par département, par région).
ORDER BYOuiDéfinit l’ordre de lecture des lignes dans chaque partition. Crucial pour le bon fonctionnement de la fonction.

⚠️ Important : La clause ORDER BY dans OVER() est obligatoire avec LEAD. 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 retourne 0 grâce au paramètre default.
  • La colonne variation calcule 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 DEPARTEMENT isole 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.
Publicité

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
TypeFonction analytique (fenêtrage)
RôleAccéder à la valeur d’une ligne suivante
Paramètre offsetNombre de lignes en avance (défaut : 1)
Paramètre defaultValeur si aucune ligne suivante (défaut : NULL)
PARTITION BYFacultatif, segmente le calcul par groupe
ORDER BYObligatoire dans la clause OVER()
Erreur fréquenteUsage dans WHERE → ORA-30483
PerformanceMeilleure qu’une auto-jointure sur grands volumes

Bonnes pratiques Oracle

  1. Toujours renseigner le paramètre default pour éviter les valeurs NULL imprévues en fin de partition, surtout si la colonne est utilisée dans un calcul mathématique (risque de résultat NULL en cascade).
  2. Associer LEAD à un ORDER BY dé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, SUM analytique, 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.

Sur le même thème

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Publicité