Til MySQL 8 brug derefter Lag vinduesfunktion.
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);
Til MySQL 5.7 eller mindre version
Vi kan bruge MySQL-variablen
at udføre dette arbejde. Overvej at dit tabelnavn er 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 |
Forklaring:
(SELECT @prev_number:= 0 AS num) AS b
vi initialiserede variablen @prev_number til nul i FROM-sætningen og sammenføjet med hver række i testen tabel.@diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff
Først genererer vi forskel og oprettede derefter en anden variabel diff at genbruge det til gennemsnitsberegning. Vi inkluderede også en betingelse for at gøre forskellen for første række til nul.@prev_number:= test.number as dummy
vi indstiller det aktuelle nummer til denne variabel, så den kan bruges af næste række.
Bemærk :Vi skal bruge denne variabel først, i begge forskel samt gennemsnit og sæt derefter til den nye værdi, så næste række kan få adgang til værdien fra den forrige række.
Du kan springe over/ændre order by
klausul i henhold til dine krav.