ホームページ >データベース >mysql チュートリアル >MySQL でラグ関数をシミュレートして連続する値の差を計算するにはどうすればよいですか?

MySQL でラグ関数をシミュレートして連続する値の差を計算するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-18 00:56:08325ブラウズ

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

MySQL でのラグ関数のシミュレーション

時系列の連続する値の差 (ラグと呼ばれる) の計算は、賢い回避策を使用して MySQL に実装できます。この手法を理解するために、次の表を考えてみましょう:

<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>

ラグ関数をシミュレートし、引用符の差を計算するには、次の戦略を採用します:

  1. 2 つの変数を初期化します。@quot の初期値は -1 で、@curr_quote は現在の相場値を追跡するために使用されます。
  2. 次のクエリを実行してテーブルを反復処理し、各行の変数を更新します。
<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>
  1. lag_quote 列には前の行の入札値が保持され、curr_quote には現在の行の入札値が保持されます。

希望の出力形式 (会社名と見積書の違い) を取得するには:

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

ネストされたクエリを使用します:

<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>

このメソッドは、前の行の値を追跡するセッション変数を維持することにより、ラグ関数を効果的にシミュレートします。計算量が多いように見えますが、ネストされたクエリは相互に関連していないため、それでも比較的効率的です。

以上がMySQL でラグ関数をシミュレートして連続する値の差を計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。