0Pricing
SQL Interview Prep · Leçon

Comparer des lignes au sein d’une même table

Les schémas de jointure réflexive pour trouver des paires, des doublons et des enregistrements adjacents

Comparer des lignes au sein d’une même table est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Interview Prep comprend 4 leçons au total.

Auto-jointures pour comparer des lignes entre elles

Au-delà des hiérarchies, l'autre grande utilisation d'une auto-jointure consiste à comparer entre elles des lignes d'une même table. Au lieu de relier un parent à un enfant, vous associez des lignes quelconques pour trouver des doublons, des correspondances proches ou des enregistrements adjacents.

Le schéma reste le même : donnez deux alias à la table et écrivez une condition ON qui exprime la relation entre les deux lignes que vous souhaitez associer.

Trouver des paires dans le même groupe

Question classique : trouver toutes les paires d'employés qui travaillent dans le même service. Joignez la table à elle-même sur l'égalité du service, tout en conservant les deux lignes distinctes.

La jointure naïve associerait également chaque employé à lui-même et produirait chaque paire deux fois. Nous corrigeons cela ensuite.

SELECT a.name, b.name, a.department
FROM employees a
JOIN employees b ON a.department = b.department;

Supprimer les paires d'une ligne avec elle-même et les doublons miroir

Le regroupement par groupe présente deux problèmes : une ligne correspond à elle-même (Alice avec Alice) et chaque paire apparaît deux fois (Alice-Bob et Bob-Alice).

Corrigez les deux problèmes avec une seule inégalité : a.id < b.id. Cela garantit que les deux lignes sont différentes et ne conserve qu'un seul ordre pour chaque paire.

SELECT a.name, b.name, a.department
FROM employees a
JOIN employees b
  ON a.department = b.department
 AND a.id < b.id;

Pourquoi a.id < b.id plutôt que a.id <> b.id

Utiliser a.id <> b.id supprime les paires d'une ligne avec elle-même, mais renvoie toujours les deux ordres, ce qui double vos résultats. Utiliser a.id < b.id supprime les paires d'une ligne avec elle-même et élimine les doublons miroir en une seule opération.

Les personnes qui vous interrogent observent particulièrement le choix entre < et <> ; il montre que vous comprenez les aspects combinatoires des auto-jointures.

-- <>  keeps Alice-Bob AND Bob-Alice (duplicated)
-- <   keeps only Alice-Bob (correct unique pairs)

Trouver les lignes en double

Pour trouver les enregistrements qui se dupliquent selon des colonnes clés, effectuez une auto-jointure sur ces colonnes et exigez des clés primaires différentes.

Nous faisons ici apparaître les clients qui partagent une adresse e-mail. Le a.id < b.id conserve chaque paire de doublons une seule fois. Souvent, un GROUP BY ... HAVING COUNT(*) > 1 est plus clair, mais l'auto-jointure montre les paires réellement en cause côte à côte.

SELECT a.id, b.id, a.email
FROM customers a
JOIN customers b
  ON a.email = b.email
 AND a.id < b.id;

Comparer des enregistrements adjacents

Une tâche fréquente pour les analystes consiste à comparer chaque ligne à la suivante dans une séquence, par exemple les ventes de chaque jour avec celles du jour précédent. Une auto-jointure peut associer des lignes consécutives.

Nous joignons ici chaque jour à la ligne située exactement un jour plus tôt afin de calculer un écart. Cette méthode fonctionne lorsque la séquence ne comporte aucune lacune.

SELECT t.day, t.amount,
       t.amount - y.amount AS change_vs_prev
FROM daily_sales t
JOIN daily_sales y
  ON y.day = t.day - INTERVAL '1 day';

Le problème des lacunes avec les auto-jointures par adjacence

La requête précédente échoue si un jour manque : aucune ligne ne se trouve exactement un jour plus tôt, donc cette ligne disparaît (avec une jointure interne) ou vous devez gérer les valeurs NULL.

C'est pourquoi les personnes qui vous interrogent vous orientent souvent vers des fonctions de fenêtrage comme LAG pour « comparer à la ligne précédente » : elles utilisent la position ordinale plutôt qu'une correspondance de valeur et tolèrent les lacunes avec élégance.

-- LAG handles gaps; the self join assumed contiguous days
SELECT day, amount,
       amount - LAG(amount) OVER (ORDER BY day) AS change_vs_prev
FROM daily_sales;

Auto-jointure ou fonction de fenêtrage

Comprenez le compromis :

  • Une auto-jointure compare des lignes selon une relation de valeur (même service, date antérieure). Flexible, elle peut toutefois multiplier les lignes et mal gérer les intervalles manquants.
  • Une fonction de fenêtrage compare les lignes selon leur position ordinale au sein d'une partition ordonnée. Elle est plus claire pour la logique des lignes précédente et suivante.

Pour « comparer à la ligne adjacente », préférez LAG/LEAD. Pour « trouver toutes les paires qui respectent une condition », l'auto-jointure est l'outil naturel.

Trouver les lignes qui dépassent leurs homologues

Voici un autre schéma : trouver les employés qui gagnent plus qu'au moins un collègue de leur service. Une auto-jointure exprime cela directement.

Nous joignons chaque employé aux autres employés du même service qui gagnent moins, puis nous conservons les employés distincts retenus. La requête se lit presque comme la phrase en français.

SELECT DISTINCT a.name, a.department, a.salary
FROM employees a
JOIN employees b
  ON a.department = b.department
 AND a.salary > b.salary;

Surveillez la multiplication des lignes

Les auto-jointures sur une colonne non unique multiplient les lignes. Former des paires au sein d'un service de 100 personnes produit environ 100 × 100 paires candidates avant le filtrage.

Incluez toujours le prédicat de déduplication (a.id < b.id) et ajoutez DISTINCT ou un regroupement lorsque vous avez seulement besoin des lignes participantes, et non de chaque paire. Mentionnez cette vigilance face à la multiplication des lignes lors des entretiens.

Choisir l'outil de comparaison

Guide de décision pour comparer des lignes au sein d'une même table :

  • Toutes les paires correspondantes (doublons, combinaisons d'un même groupe) : auto-jointure avec a.id < b.id.
  • La ligne précédente ou suivante dans un ordre : fonction de fenêtrage (LAG/LEAD).
  • Comparer chaque ligne à un agrégat de groupe : sous-requête corrélée ou agrégat de fenêtrage.

Vérification rapide

Vous souhaitez obtenir chaque paire unique de produits appartenant à la même catégorie, sans qu'un produit soit associé à lui-même ni que les mêmes paires apparaissent dans l'ordre inverse.

Récapitulatif : comparer des lignes au sein d'une même table

Points essentiels :

  • Effectuez une auto-jointure de la table pour associer ses propres lignes lors de la recherche de doublons et de combinaisons au sein d'un même groupe.
  • Utilisez a.id < b.id pour éliminer les paires d'une ligne avec elle-même et les doublons inversés au moyen d'un seul prédicat.
  • Les comparaisons d'adjacence par auto-jointure échouent en présence d'intervalles manquants ; préférez LAG/LEAD pour la logique des lignes précédente et suivante.
  • Tenez toujours compte de la multiplication des lignes lors d'une jointure sur des colonnes non uniques.

Questions Fréquemment Posées

La leçon « Comparer des lignes au sein d’une même table » est-elle gratuite ?

Oui — le texte complet de « Comparer des lignes au sein d’une même table » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Interview Prep, passe à CoddyKit PRO. Le cours SQL Interview Prep comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Comparer des lignes au sein d’une même table » ?

Les schémas de jointure réflexive pour trouver des paires, des doublons et des enregistrements adjacents Tu pratiques SQL Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer SQL Interview Prep ?

Aucune expérience préalable n'est requise. SQL Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Comparer des lignes au sein d’une même table » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon SQL Interview Prep ?

Oui. Chaque leçon SQL Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. CROSS JOIN et produits cartésiens
  2. SELF JOIN pour les hiérarchies
  3. Comparer des lignes au sein d’une même table
  4. Choisir le bon type de jointure
← Retour à SQL Interview Prep