För MySQL 8 använd sedan Lag fönsterfunktion.
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);
För MySQL 5.7 eller lägre version
Vi kan använda MySQL-variabeln
att göra det här jobbet. Tänk på att ditt tabellnamn är 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 |
Förklaring:
(SELECT @prev_number:= 0 AS num) AS b
vi initierade variabeln @prev_number till noll i FROM-satsen och sammanfogad med varje rad i testet tabell.@diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff
Först genererar vi skillnad och skapade sedan en annan variabel diff att återanvända den för genomsnittsberäkning. Vi inkluderade också ett villkor för att göra skillnaden för första raden till noll.@prev_number:= test.number as dummy
vi ställer in nuvarande nummer till denna variabel, så att den kan användas av nästa rad.
Obs :Vi måste använda den här variabeln först, i båda skillnaderna samt genomsnitt och ställ sedan in det nya värdet, så att nästa rad kan komma åt värdet från föregående rad.
Du kan hoppa över/ändra order by
klausul enligt dina krav.