Maison > Article > base de données > Comment calculer la différence entre les valeurs de lignes consécutives dans MySQL ?
Récupération des différences de colonnes dans une instruction SELECT MySQL
Dans MySQL, obtenir la différence entre les valeurs de deux lignes d'une instruction SELECT implique l'utilisation appropriée Techniques SELECT et JOIN. Examinons ce problème et explorons les solutions disponibles.
Le tableau fourni contient des lignes organisées par identifiant, kilomètres, date, identifiant de voiture, conducteur de voiture, etc. Pour trier le tableau correctement, une instruction SELECT avec un ORDER BY est utilisée, ce qui donne un tableau trié.
Ensuite, l'objectif est de créer une vue qui comprend une colonne supplémentaire, "number_km_since_last_date", fournissant le nombre de kilomètres depuis la dernière date enregistrée. Une approche utilise un INNER JOIN, mais elle est confrontée à des défis en raison de lignes non triées.
Utilisation de LEFT JOIN et d'une sous-requête :
Une méthode plus efficace consiste à utiliser un LEFT JOIN combiné avec une sous-requête. La sous-requête sélectionne la date maximale inférieure à la date de la ligne actuelle dans la même table. En joignant la ligne actuelle avec la ligne maximale précédente, la différence en kilomètres peut être calculée à l'aide de l'expression "mt1.Kilometers - IFNULL(mt2.Kilometers, 0)". La requête SQL résultante est :
SELECT mt1.ID, mt1.Kilometers, mt1.date, mt1.Kilometers - IFNULL(mt2.Kilometers, 0) AS number_km_since_last_date FROM myTable mt1 LEFT JOIN myTable mt2 ON mt2.Date = ( SELECT MAX(Date) FROM myTable mt3 WHERE mt3.Date < mt1.Date ) ORDER BY mt1.date
Émulation de la fonction LAG() à l'aide de MySQL Hack :
Une autre technique utilise l'émulation de la fonction lag(), qui n'est pas nativement pris en charge dans MySQL. Une variable définie par l'utilisateur, @kilo, est initialisée à zéro. Au fur et à mesure que chaque ligne est traitée dans la requête, ses kilomètres sont soustraits de la valeur actuelle de @kilo, et @kilo est ensuite mis à jour avec les kilomètres actuels. Cela fournit effectivement la différence en kilomètres depuis la rangée précédente. La requête résultante est :
SET @kilo=0; SELECT mt1.ID, mt1.Kilometers - @kilo AS number_km_since_last_date, @kilo := mt1.Kilometers Kilometers, mt1.date FROM myTable mt1 ORDER BY mt1.date
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!