sql >> Databáze >  >> RDS >> Mysql

Jak získat rozdíl mezi po sobě jdoucími řádky v MySQL?

Pro MySQL 8 poté použijte Lag funkce okna.

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

Pro MySQL 5.7 nebo nižší verzi

Můžeme použít proměnnou MySQL dělat tuto práci. Zvažte, že název vaší tabulky je 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  |

Vysvětlení:

  • (SELECT @prev_number:= 0 AS num) AS b inicializovali jsme proměnnou @prev_number na nulu v klauzuli FROM a spojené s každým řádkem testu stůl.
  • @diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff Nejprve vygenerujeme rozdíl a poté vytvoříme další proměnnou diff znovu použít pro výpočet průměru. Také jsme zahrnuli jednu podmínku, aby byl rozdíl pro první řádek nulový.
  • @prev_number:= test.number as dummy nastavujeme aktuální počet na tuto proměnnou, takže ji může použít další řádek.

Poznámka :Tuto proměnnou musíme použít jako první, v obou rozdílech stejně jako průměrné a poté nastavte na novou hodnotu, takže další řádek bude mít přístup k hodnotě z předchozího řádku.

order by můžete přeskočit/upravit doložka podle vašich požadavků.



  1. Matice podporovaných verzí Oracle

  2. Časové razítko beze změny při aktualizaci

  3. 2 způsoby, jak vrátit seznam propojených serverů v SQL Server pomocí T-SQL

  4. VYBERTE mnoho až mnoho tabulek v jednom dotazu