Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment faire la différence entre des lignes consécutives dans MySQL ?

Pour MySQL 8 puis utilisez Lag fonction fenêtre.

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

Pour MySQL 5.7 ou version inférieure

Nous pouvons utiliser la variable MySQL pour faire ce travail. Considérez que le nom de votre table est 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  |

Explication :

  • (SELECT @prev_number:= 0 AS num) AS b nous avons initialisé la variable @prev_number à zéro dans la clause FROM et jointe à chaque ligne du test tableau.
  • @diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff Nous générons d'abord une différence, puis nous créons une autre variable diff pour le réutiliser pour le calcul de la moyenne. Nous avons également inclus une condition pour que la différence pour la première ligne soit égale à zéro.
  • @prev_number:= test.number as dummy nous définissons le numéro actuel à cette variable, afin qu'elle puisse être utilisée par la ligne suivante.

Remarque  :Nous devons d'abord utiliser cette variable, à la fois différence ainsi que moyen puis définissez la nouvelle valeur, de sorte que la ligne suivante puisse accéder à la valeur de la ligne précédente.

Vous pouvez ignorer/modifier order by clause selon vos besoins.