Maison >base de données >tutoriel mysql >Comment simuler la fonction Lag dans MySQL ?

Comment simuler la fonction Lag dans MySQL ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-18 01:01:08772parcourir

How to Simulate the Lag Function in MySQL?

Simuler la fonction LAG dans MySQL

MySQL ne prend pas en charge nativement la fonction LAG(), qui est généralement utilisée pour calculer la différence entre la valeur de la ligne actuelle et la valeur de la ligne précédente. Cependant, nous pouvons résoudre ce problème proprement en utilisant des variables MySQL.

Jetons un coup d'œil à l'exemple d'ensemble de données fourni :

<code>| 时间                | 公司    | 报价 |
+---------------------+---------+-------+
| 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>

Pour simuler la fonction LAG(), on peut utiliser 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>

Cette requête utilise la variable MySQL @quot pour stocker la valeur citée de la ligne précédente. En attribuant la valeur citée de la ligne actuelle à curr_quote, nous pouvons calculer la différence entre elles.

Résultat :

<code>| 时间                | 公司    | lag_quote | curr_quote |
+---------------------+---------+----------+-----------+
| 0000-00-00 00:00:00 | GOOGLE  | -1        | 40         |
| 2012-07-02 21:28:05 | GOOGLE  | 40        | 60         |
| 2012-07-02 21:28:51 | SAP     | -1        | 60         |
| 2012-07-02 21:29:05 | SAP     | 60        | 20         |</code>

Pour obtenir le format de sortie souhaité :

<code>GOOGLE | 20
SAP    | 40</code>

Utilisez la requête suivante :

<code class="language-sql">SET @quot = 0, @latest = 0, @comp = '';
SELECT
  B.*
FROM
  (
    SELECT
      A.time,
      A.change,
      IF(@comp = A.company, 1, 0) 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>

Résultat :

<code>| 时间                | 公司    | change |
+---------------------+---------+-------+
| 2012-07-02 21:28:05 | GOOGLE  | 20     |
| 2012-07-02 21:29:05 | SAP     | -40    |</code>

Veuillez noter que la valeur de modification de SAP dans le résultat de la deuxième requête est de -40 au lieu de 40. Ceci n'est pas cohérent avec les résultats de l'article d'origine. Il peut y avoir un problème avec la deuxième requête de l'article d'origine. Le code ci-dessus corrige cette erreur et simule plus précisément le comportement de la fonction LAG.

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