Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie erhalte ich den Unterschied zwischen aufeinanderfolgenden Zeilen in MySQL?

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.