sql >> Databasteknik >  >> RDS >> Mysql

Hur får man skillnaden mellan på varandra följande rader i MySQL?

För MySQL 8 använd sedan Lag fönsterfunktion.

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 eller lägre version

Vi kan använda MySQL-variabeln att göra det här jobbet. Tänk på att ditt tabellnamn är 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  |

Förklaring:

  • (SELECT @prev_number:= 0 AS num) AS b vi initierade variabeln @prev_number till noll i FROM-satsen och sammanfogad med varje rad i testet tabell.
  • @diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff Först genererar vi skillnad och skapade sedan en annan variabel diff att återanvända den för genomsnittsberäkning. Vi inkluderade också ett villkor för att göra skillnaden för första raden till noll.
  • @prev_number:= test.number as dummy vi ställer in nuvarande nummer till denna variabel, så att den kan användas av nästa rad.

Obs :Vi måste använda den här variabeln först, i båda skillnaderna samt genomsnitt och ställ sedan in det nya värdet, så att nästa rad kan komma åt värdet från föregående rad.

Du kan hoppa över/ändra order by klausul enligt dina krav.



  1. Hur man tar bort efterföljande blanksteg i SQL Server – RTRIM()

  2. Uppföljning av Summer Performance Palooza 2013

  3. Skillnaden mellan N'String' vs U'String' bokstaver i Oracle

  4. MySQL AUTO_INCREMENT rullar inte tillbaka