Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mensimulasikan Fungsi Lag dalam MySQL?

Bagaimana untuk Mensimulasikan Fungsi Lag dalam MySQL?

Barbara Streisand
Barbara Streisandasal
2025-01-18 01:01:08772semak imbas

How to Simulate the Lag Function in MySQL?

Simulasikan fungsi LAG dalam MySQL

MySQL tidak menyokong fungsi LAG() secara asli, yang biasanya digunakan untuk mengira perbezaan antara nilai baris semasa dan nilai baris sebelumnya. Walau bagaimanapun, kita boleh menyelesaikan masalah ini dengan kemas menggunakan pembolehubah MySQL.

Mari kita lihat contoh set data yang disediakan:

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

Untuk mensimulasikan fungsi LAG(), kita boleh menggunakan pertanyaan berikut:

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

Pertanyaan ini menggunakan pembolehubah MySQL @quot untuk menyimpan nilai petikan baris sebelumnya. Dengan memperuntukkan nilai petikan baris semasa kepada curr_quote, kita boleh mengira perbezaan antaranya.

Keputusan:

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

Untuk mendapatkan format output yang diingini:

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

Gunakan pertanyaan berikut:

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

Keputusan:

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

Sila ambil perhatian bahawa nilai perubahan SAP dalam hasil pertanyaan kedua ialah -40 dan bukannya 40. Ini tidak konsisten dengan hasil artikel asal mungkin terdapat masalah dengan pertanyaan kedua artikel asal. Kod di atas membetulkan ralat ini dan mensimulasikan kelakuan fungsi LAG dengan lebih tepat.

Atas ialah kandungan terperinci Bagaimana untuk Mensimulasikan Fungsi Lag dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn