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 ?
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!