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

Hvordan får man forskellen mellem på hinanden følgende rækker i MySQL?

Til MySQL 8 brug derefter Lag vinduesfunktion.

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

Til MySQL 5.7 eller mindre version

Vi kan bruge MySQL-variablen at udføre dette arbejde. Overvej at dit tabelnavn er 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 |

Forklaring:

  • (SELECT @prev_number:= 0 AS num) AS b vi initialiserede variablen @prev_number til nul i FROM-sætningen og sammenføjet med hver række i testen tabel.
  • @diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff Først genererer vi forskel og oprettede derefter en anden variabel diff at genbruge det til gennemsnitsberegning. Vi inkluderede også en betingelse for at gøre forskellen for første række til nul.
  • @prev_number:= test.number as dummy vi indstiller det aktuelle nummer til denne variabel, så den kan bruges af næste række.

Bemærk :Vi skal bruge denne variabel først, i begge forskel samt gennemsnit og sæt derefter til den nye værdi, så næste række kan få adgang til værdien fra den forrige række.

Du kan springe over/ændre order by klausul i henhold til dine krav.



  1. Hvordan tæller man antallet af forekomster af en bestemt understreng i en SQL-varchar?

  2. SQL OPDATERING alle værdier i et felt med tilføjet streng CONCAT virker ikke

  3. SQL Server PIVOT måske?

  4. Optimering af Microsoft Access med SQL Server IndyPass – 21/5/19