Maison >base de données >tutoriel mysql >Comment calculer les différences kilométriques entre les lignes dans une table MySQL ?

Comment calculer les différences kilométriques entre les lignes dans une table MySQL ?

DDD
DDDoriginal
2024-11-08 20:03:02649parcourir

How to Calculate Kilometer Differences Between Rows in a MySQL Table?

Calcul des différences entre les lignes dans une instruction MySQL SELECT

Dans ce scénario, vous disposez d'une table MySQL contenant des données telles que des kilomètres, des dates, et des informations sur la voiture, mais elles ne sont pas toujours classées par ordre chronologique. Votre objectif est de créer une vue qui inclut une colonne supplémentaire affichant le nombre de kilomètres depuis la dernière date pour chaque voiture.

Pour y parvenir, vous ne pouvez pas vous appuyer sur un simple JOIN sur la colonne ID car les données sont pas triés par ordre chronologique. Au lieu de cela, vous devez utiliser un LEFT JOIN et une sous-requête pour déterminer la date maximale qui précède la date actuelle pour chaque ligne.

Utilisation d'un LEFT JOIN et d'une sous-requête

La requête suivante utilise un LEFT JOIN pour connecter la ligne actuelle du tableau (mt1) avec une ligne (mt2) dont la date maximale est antérieure à la date de mt1 :

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

Cette requête calcule la différence entre les kilomètres de la ligne actuelle (mt1) et les kilomètres de la ligne avec la date maximale antérieure à la date actuelle (mt2). Si mt2 est NULL, cela signifie qu'il n'y a pas de ligne précédente, donc la différence est 0.

Méthode alternative utilisant MySQL Hackery

Comme alternative, vous pouvez utiliser un MySQL hack pour émuler la fonction lag(), qui n'est pas supportée nativement dans MySQL :

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

Cette requête utilise une variable définie par l'utilisateur (@kilo) pour garder une trace de la valeur du kilomètre précédent. La différence entre la valeur kilométrique actuelle et @kilo vous donne le nombre de kilomètres depuis la dernière date. La variable @kilo est mise à jour avec la valeur kilométrique actuelle après le traitement de chaque ligne.

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