Voor MySQL 8 gebruik dan Lag vensterfunctie.
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);
Voor MySQL 5.7 of lagere versie
We kunnen de MySQL-variabele
gebruiken om dit werk te doen. Bedenk dat uw tabelnaam test
is .
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 |
Uitleg:
(SELECT @prev_number:= 0 AS num) AS b
we hebben variabele @prev_number geïnitialiseerd naar nul in de FROM-clausule en samengevoegd met elke rij van de test tafel.@diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff
Eerst genereren we verschil en vervolgens creëerden we een andere variabele diff om het opnieuw te gebruiken voor gemiddelde berekening. We hebben ook een voorwaarde toegevoegd om het verschil voor de eerste rij als nul te maken.@prev_number:= test.number as dummy
we stellen het huidige nummer in aan deze variabele, zodat deze door de volgende rij kan worden gebruikt.
Opmerking :We moeten deze variabele eerst gebruiken, in beide verschillen evenals gemiddelde en stel vervolgens in op de nieuwe waarde, zodat de volgende rij toegang heeft tot de waarde van de vorige rij.
U kunt order by
clausule volgens uw vereisten.