Maison > base de données > tutoriel mysql > Comment puis-je simuler la fonction LAG dans MySQL pour calculer les différences entre des lignes consécutives ?

Comment puis-je simuler la fonction LAG dans MySQL pour calculer les différences entre des lignes consécutives ?

Patricia Arquette
Libérer: 2025-01-18 01:07:09
original
166 Les gens l'ont consulté

How Can I Simulate the LAG Function in MySQL to Calculate Differences Between Consecutive Rows?

Simuler la fonction LAG dans MySQL

Il n'y a pas de fonction LAG directe dans MySQL, mais nous pouvons intelligemment utiliser des variables définies par l'utilisateur pour simuler sa fonction et calculer la différence entre des lignes consécutives.

Supposons que nous ayons le tableau suivant :

<code>| time                | company | quote |
+---------------------+---------+-------+
| 0000-00-00 00:00:00 | GOOGLE  |    40 |
| 2012-07-02 21:28:05 | GOOGLE  |    60 |
| 2012-07-02 21:28:51 | SAP     |    60 |
| 2012-07-02 21:29:05 | SAP     |    20 |</code>
Copier après la connexion

On peut simuler la fonction LAG en utilisant la requête suivante :

<code class="language-sql">SET @quot=-1;
SELECT time, company, @quot AS lag_quote, @quot:=quote AS curr_quote
FROM stocks
ORDER BY company, time;</code>
Copier après la connexion

Cette requête :

  • Initialisez la variable définie par l'utilisateur @quot à -1.
  • Calculez la différence entre la ligne actuelle quote et celle de la ligne précédente quote (bien que la différence ne soit pas calculée directement ici, mais comment obtenir la ligne de données précédente est indiqué).
  • Stockez la valeur quote de la ligne actuelle dans @quot pour l'utiliser lors de la prochaine itération.

Formater les résultats

Pour obtenir le format souhaité :

<code>GOOGLE | 20
SAP    | 40</code>
Copier après la connexion

Nous pouvons utiliser des sous-requêtes imbriquées :

<code class="language-sql">SET @quot=0,@latest=0,company='';
SELECT B.* 
FROM (
    SELECT A.time, A.change, IF(@comp=A.company, 0, 1) AS LATEST, @comp:=A.company AS company
    FROM (
        SELECT time, company, quote - @quot AS change, @quot:=quote AS curr_quote
        FROM stocks
        ORDER BY company, time
    ) A
    ORDER BY company, time DESC
) B
WHERE B.LATEST = 1;</code>
Copier après la connexion

Cette requête :

  • Calculez la différence de quote et stockez-la dans la colonne change.
  • Utilisez l'instruction IF et la variable @comp pour identifier la première ligne (LATEST=1) de chaque groupe d'entreprises.
  • Filtrez les résultats pour inclure uniquement la première ligne de chaque groupe d'entreprises.

Conclusion

La méthode ci-dessus simule efficacement la fonction LAG dans MySQL, offrant un moyen pratique et efficace pour l'analyse des données de séries chronologiques. Il convient de noter que les deux méthodes sont mises en œuvre de manière légèrement différente. La première montre plus directement comment accéder à la ligne de données précédente, tandis que la seconde se concentre davantage sur le calcul de la différence et le formatage des résultats de sortie. La méthode que vous choisissez dépend de vos besoins spécifiques.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal