Für MySQL 8 Verwenden Sie dann Lag Fensterfunktion.
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 oder niedrigere Version
Wir können die MySQL-Variable
verwenden um diesen Job zu machen. Stellen Sie sich vor, Ihr Tabellenname ist 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 |
Erklärung:
(SELECT @prev_number:= 0 AS num) AS b
wir haben die Variable @prev_number initialisiert in der FROM-Klausel auf Null gesetzt und mit jeder Zeile des Tests verbunden Tabelle.@diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff
Zuerst erzeugen wir eine Differenz und dann eine weitere Variable diff um es für die Durchschnittsberechnung wiederzuverwenden. Außerdem haben wir eine Bedingung eingefügt, um den Unterschied für die erste Zeile auf Null zu setzen.@prev_number:= test.number as dummy
Wir stellen die aktuelle Nummer ein zu dieser Variablen, damit sie von der nächsten Zeile verwendet werden kann.
Hinweis :Wir müssen diese Variable zuerst verwenden, in beiden Unterschied sowie durchschnittlich und dann auf den neuen Wert gesetzt, sodass die nächste Zeile auf den Wert der vorherigen Zeile zugreifen kann.
Sie können order by
überspringen/ändern Klausel gemäß Ihren Anforderungen.