MySQL で LAG 関数をシミュレートする
MySQL は、通常、現在の行の値と前の行の値の差を計算するために使用される LAG() 関数をネイティブにサポートしていません。ただし、MySQL 変数を使用すると、この問題をうまく解決できます。
提供されているサンプル データセットを見てみましょう:
<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>
LAG() 関数をシミュレートするには、次のクエリを使用できます:
<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>
このクエリは、MySQL 変数 @quot
を使用して、前の行の引用符で囲まれた値を保存します。現在の行の引用符で囲まれた値を curr_quote
に代入することで、それらの差を計算できます。
結果:
<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>
目的の出力形式を取得するには:
<code>GOOGLE | 20 SAP | 40</code>
次のクエリを使用します:
<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>
結果:
<code>| 时间 | 公司 | change | +---------------------+---------+-------+ | 2012-07-02 21:28:05 | GOOGLE | 20 | | 2012-07-02 21:29:05 | SAP | -40 |</code>
2 番目のクエリの結果の SAP の変更値は 40 ではなく -40 であることに注意してください。これは元の記事の結果と一致しません。元の記事の 2 番目のクエリに問題がある可能性があります。 上記のコードはこのエラーを修正し、LAG 関数の動作をより正確にシミュレートします。
以上がMySQL で Lag 関数をシミュレートするには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。