Maison > Article > base de données > Comment calculer la différence de lignes d'une instruction MySQL SELECT ?
Calcul de la différence entre les lignes d'une instruction SELECT MySQL
Dans MySQL, le calcul de la différence entre les lignes d'une instruction SELECT peut être effectué via diverses méthodes. Une approche courante consiste à utiliser une auto-jointure, vous permettant de comparer les lignes d'un même tableau. Considérez le scénario suivant :
Énoncé du problème :
Vous disposez d'un tableau contenant des données sur les véhicules, notamment leurs kilomètres, leur date, l'identification de la voiture et le conducteur. Cependant, en raison des différentes séquences de saisie des données, les données peuvent ne pas être triées. Votre objectif est de créer une vue qui affiche le nombre de kilomètres parcourus depuis la dernière entrée pour chaque combinaison voiture-conducteur, ce qui donne le format suivant :
ID | Kilometers | date | car_id | car_driver | number_km_since_last_date 1 | 100 | 2012-05-04 | 1 | 1 | 0 2 | 200 | 2012-05-08 | 1 | 1 | 100 4 | 600 | 2012-05-16 | 1 | 1 | 400 3 | 1000 | 2012-05-25 | 1 | 1 | 400
Solution 1 : Rejoindre avec sous-requête
Vous pouvez utiliser une sous-requête dans un INNER JOIN pour récupérer les kilomètres de la ligne précédente pour chaque record :
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
Dans cette requête, une sous-requête sélectionne la date maximale avant la date de la ligne actuelle, et cette date maximale est ensuite mise en correspondance avec un enregistrement dans LEFT JOIN.
Solution 2 : émuler la fonction Lag
MySQL n'offre pas de fonction lag() intégrée, mais vous pouvez imiter son comportement via une variable définie par l'utilisateur :
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
Dans cette requête, la variable définie par l'utilisateur @kilo stocke les kilomètres de la ligne précédente. À chaque itération, la variable définie par l'utilisateur est mise à jour, suivant efficacement l'évolution des kilomètres.
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!