Maison > base de données > tutoriel mysql > Comment puis-je simuler une fonction de décalage dans MySQL pour calculer les différences entre les valeurs successives ?

Comment puis-je simuler une fonction de décalage dans MySQL pour calculer les différences entre les valeurs successives ?

Linda Hamilton
Libérer: 2025-01-18 00:56:08
original
316 Les gens l'ont consulté

How Can I Simulate a Lag Function in MySQL to Calculate Differences Between Successive Values?

Fonction de simulation de décalage dans MySQL

Le calcul de la différence entre des valeurs consécutives dans une série temporelle (appelée décalage) peut être implémenté dans MySQL à l'aide d'une solution de contournement intelligente. Pour comprendre cette technique, considérons le tableau fourni :

<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

Pour simuler la fonction lag et calculer la différence entre guillemets, nous adoptons la stratégie suivante :

  1. Initialise deux variables, @quot a une valeur initiale de -1 et @curr_quote est utilisé pour suivre la valeur de cotation actuelle.
  2. Exécutez la requête suivante pour parcourir la table, en mettant à jour les variables à chaque ligne :
<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
    La colonne
  1. lag_quote contient désormais la valeur de l'enchère de la ligne précédente et curr_quote contient la valeur de l'enchère de la ligne actuelle.

Pour obtenir le format de sortie souhaité (différences entreprise et devis) :

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

Nous utilisons des 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,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>
Copier après la connexion

Cette méthode simule efficacement une fonction de décalage en conservant une variable de session qui garde une trace de la valeur de la ligne précédente. Même si cela semble gourmand en calcul, les requêtes imbriquées ne sont pas liées les unes aux autres, ce qui reste relativement efficace.

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