MySQL 8の場合 次に、ラグ を使用します ウィンドウ関数。
SELECT
test.id,
test.date,
test.number,
test.qty,
IFNULL(test.number - LAG(test.number) OVER w, 0) AS diff,
ROUND(IFNULL(test.number - LAG(test.number) OVER w, 0)/ test.qty, 2) AS 'Avg'
FROM purchases test
WINDOW w AS (ORDER BY test.`date` ASC);
MySQL5.7以下のバージョンの場合
MySQL変数
を使用できます この仕事をするために。テーブル名がtest
であると考えてください 。
SELECT
test.id,
test.date,
test.number,
test.qty,
@diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff,
ROUND(@diff / qty, 2) 'avg',
@prev_number:= test.number as dummy
FROM
test,
(SELECT @prev_number:= 0 AS num) AS b
ORDER BY test.`date` ASC;
-------------------------------------------------------------------------------
Output:
| id | date | number| qty | diff | avg | dummy |
-----------------------------------------------------------------
| 114 | 2018-10-07 | 200 | 5 | 0 | 0.00 | 200 |
| 120 | 2018-12-01 | 300 | 10 | 100 | 10.00 | 300 |
| 123 | 2019-02-03 | 700 | 12 | 400 | 33.33 | 700 |
| 1126 | 2019-03-07 | 1000 | 15 | 300 | 20.00 | 1000 |
説明:
-
(SELECT @prev_number:= 0 AS num) AS b
変数@prev_numberを初期化しました FROM句でゼロになり、テストの各行に結合されます テーブル。 -
@diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff
最初に差分を生成し、次に別の変数 diff を作成します 平均計算に再利用します。また、最初の行の差分をゼロにするための条件を1つ含めました。 -
@prev_number:= test.number as dummy
現在の番号を設定しています この変数に追加するので、次の行で使用できます。
注 :両方の違いで、最初にこの変数を使用する必要があります 平均と同様に 次に、新しい値に設定して、次の行が前の行の値にアクセスできるようにします。
order by
をスキップ/変更できます 要件に応じた条項。