Mysql
 sql >> Database >  >> RDS >> Mysql

Come ottenere la differenza tra righe consecutive in MySQL?

Per MySQL 8 quindi usa Lag funzione finestra.

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);

Per MySQL 5.7 o versione precedente

Possiamo usare la variabile MySQL per fare questo lavoro. Considera che il nome della tua tabella è 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  |

Spiegazione:

  • (SELECT @prev_number:= 0 AS num) AS b abbiamo inizializzato la variabile @prev_number a zero nella clausola FROM e unito a ogni riga del test tabella.
  • @diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff Per prima cosa stiamo generando la differenza e poi abbiamo creato un'altra variabile diff per riutilizzarlo per il calcolo della media. Inoltre abbiamo incluso una condizione per rendere la differenza per la prima riga zero.
  • @prev_number:= test.number as dummy stiamo impostando il numero attuale a questa variabile, in modo che possa essere utilizzata dalla riga successiva.

Nota :Dobbiamo prima usare questa variabile, in entrambe le differenze così come media e quindi imposta il nuovo valore, in modo che la riga successiva possa accedere al valore della riga precedente.

Puoi saltare/modificare order by clausola secondo le vostre esigenze.