sql >> Database >  >> RDS >> Mysql

Hoe het verschil tussen opeenvolgende rijen in MySQL te krijgen?

Voor MySQL 8 gebruik dan Lag vensterfunctie.

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

Voor MySQL 5.7 of lagere versie

We kunnen de MySQL-variabele gebruiken om dit werk te doen. Bedenk dat uw tabelnaam test is .

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  |

Uitleg:

  • (SELECT @prev_number:= 0 AS num) AS b we hebben variabele @prev_number geïnitialiseerd naar nul in de FROM-clausule en samengevoegd met elke rij van de test tafel.
  • @diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff Eerst genereren we verschil en vervolgens creëerden we een andere variabele diff om het opnieuw te gebruiken voor gemiddelde berekening. We hebben ook een voorwaarde toegevoegd om het verschil voor de eerste rij als nul te maken.
  • @prev_number:= test.number as dummy we stellen het huidige nummer in aan deze variabele, zodat deze door de volgende rij kan worden gebruikt.

Opmerking :We moeten deze variabele eerst gebruiken, in beide verschillen evenals gemiddelde en stel vervolgens in op de nieuwe waarde, zodat de volgende rij toegang heeft tot de waarde van de vorige rij.

U kunt order by clausule volgens uw vereisten.



  1. Meer showplan-verbeteringen? Ja graag!

  2. MySQL-back-ups beveiligen:een gids

  3. Primaire SQL-sleutel

  4. Begin met het bekijken van zoekopdrachtresultaten voordat de zoekopdracht eindigt