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!