Maison >base de données >tutoriel mysql >Comment calculer la différence de valeur entre des lignes consécutives dans une table de base de données à l'aide de SQL ?

Comment calculer la différence de valeur entre des lignes consécutives dans une table de base de données à l'aide de SQL ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-10 15:22:43858parcourir

How to Calculate the Value Difference Between Consecutive Rows in a Database Table Using SQL?

Calcul de la différence entre des lignes consécutives dans une table de base de données à l'aide de SQL

Disons que vous avez une table de base de données avec un entier non séquentiel comme identifiant de ligne (rowInt) et une valeur numérique (Value). Le défi est de calculer efficacement la différence entre les Value de lignes consécutives à l'aide de SQL.

Une simple requête comme celle-ci récupérera les données :

<code class="language-sql">SELECT * FROM myTable ORDER BY rowInt;</code>

Cependant, nous devons calculer et afficher la différence. Le format de sortie souhaité est :

<code>rowInt   Value   Diff
2        23      22    --45-23
3        45     -35    --10-45
9        10     -45    --0-45
17       0       0     --0 (or NULL, depending on desired behavior)</code>

Voici comment y parvenir en utilisant une auto-jointure avec une sous-requête :

<code class="language-sql">SELECT
    c.rowInt,
    c.Value,
    ISNULL(n.Value, 0) - c.Value AS Diff
FROM
    myTable AS c
LEFT JOIN
    myTable AS n ON n.rowInt = (SELECT MIN(rowInt) FROM myTable WHERE rowInt > c.rowInt)
ORDER BY c.rowInt;</code>

Cette requête effectue un LEFT JOIN de la table (myTable) sur elle-même, alias c (actuel) et n (suivant). La sous-requête dans la clause ON trouve le minimum rowInt supérieur à celui de la ligne actuelle rowInt, identifiant ainsi la ligne suivante. ISNULL(n.Value, 0) gère le cas où il n'y a pas de ligne suivante (pour la dernière ligne), en remplaçant 0 par le n.Value manquant. La différence est ensuite calculée et alias Diff. La clause finale ORDER BY garantit que les résultats sont présentés dans le bon ordre. Alternativement, vous pouvez utiliser COALESCE au lieu de ISNULL. Le choix dépend de votre système de base de données spécifique.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn