Calcul des différences de valeurs de lignes consécutives dans SQL
Les requêtes de base de données impliquent souvent plus qu'une simple récupération de données. Déterminer la différence entre les valeurs de lignes consécutives présente un défi courant. Cet article détaille les méthodes efficaces pour calculer ces différences en SQL, en se concentrant sur les scénarios dans lesquels l'ordre des lignes n'est pas strictement séquentiel.
Exemple de scénario :
Imaginez un tableau avec des valeurs entières, pas nécessairement classées séquentiellement par un identifiant de ligne :
<code>rowInt | Value --------+------ 2 | 23 3 | 45 17 | 10 9 | 0</code>
L'objectif est de calculer la différence entre chaque Value
et le Value
de la ligne immédiatement suivante, ce qui donne :
<code>rowInt | Value | Diff --------+--------+------ 2 | 23 | 22 3 | 45 | -35 9 | 0 | -45 17 | 10 | 10</code>
Approche SQL Server 2005 (fonctions pré-fenêtre) :
Avant l'introduction des fonctions de fenêtre, SQL Server 2005 s'appuyait sur une méthode moins efficace combinant sous-requêtes et fonctions d'agrégation :
<code class="language-sql">SELECT [current].rowInt, [current].Value, ISNULL([next].Value, 0) - [current].Value AS Diff FROM sourceTable AS [current] LEFT JOIN ( SELECT MIN(rowInt) AS rowInt, Value FROM sourceTable WHERE rowInt > [current].rowInt GROUP BY Value ) AS [next] ON [next].rowInt = [current].rowInt</code>
Explication :
ISNULL()
gère les cas où aucune ligne suivante n'existe, la valeur par défaut étant 0.rowInt
et le Value
de la ligne suivante.Value
de la ligne actuelle du Value
de la ligne suivante.Considérations relatives aux performances :
Cette ancienne technique peut s'avérer inefficace pour les grands ensembles de données en raison des multiples analyses de tables impliquées. Le SQL moderne offre des solutions plus optimisées.
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!