Pour MySQL 8 puis utilisez Lag fonction fenêtre.
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);
Pour MySQL 5.7 ou version inférieure
Nous pouvons utiliser la variable MySQL
pour faire ce travail. Considérez que le nom de votre table est 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 |
Explication :
(SELECT @prev_number:= 0 AS num) AS b
nous avons initialisé la variable @prev_number à zéro dans la clause FROM et jointe à chaque ligne du test tableau.@diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff
Nous générons d'abord une différence, puis nous créons une autre variable diff pour le réutiliser pour le calcul de la moyenne. Nous avons également inclus une condition pour que la différence pour la première ligne soit égale à zéro.@prev_number:= test.number as dummy
nous définissons le numéro actuel à cette variable, afin qu'elle puisse être utilisée par la ligne suivante.
Remarque :Nous devons d'abord utiliser cette variable, à la fois différence ainsi que moyen puis définissez la nouvelle valeur, de sorte que la ligne suivante puisse accéder à la valeur de la ligne précédente.
Vous pouvez ignorer/modifier order by
clause selon vos besoins.