Maison  >  Article  >  base de données  >  Comment calculer la différence entre les valeurs de lignes consécutives dans MySQL ?

Comment calculer la différence entre les valeurs de lignes consécutives dans MySQL ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-07 04:18:02451parcourir

How to Calculate the Difference Between Values in Consecutive Rows in 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!

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