Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak uzyskać różnicę między kolejnymi wierszami w MySQL?

Dla MySQL 8 następnie użyj Opóźnienie funkcja 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);

Dla MySQL 5.7 lub mniejszej wersji

Możemy użyć zmiennej MySQL wykonać tę pracę. Weź pod uwagę, że nazwa Twojej tabeli to 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  |

Wyjaśnienie:

  • (SELECT @prev_number:= 0 AS num) AS b zainicjowaliśmy zmienną @prev_number do zera w klauzuli FROM i połączone z każdym wierszem testu stół.
  • @diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff Najpierw generujemy różnicę, a następnie tworzymy kolejną zmienną diff aby ponownie użyć go do średniej kalkulacji. Zawarliśmy również jeden warunek, aby różnica dla pierwszego wiersza wynosiła zero.
  • @prev_number:= test.number as dummy ustawiamy aktualny liczbę do tej zmiennej, aby można było jej użyć w następnym wierszu.

Uwaga :Najpierw musimy użyć tej zmiennej, w obu różnicach jak również średnia a następnie ustawić nową wartość, aby następny wiersz mógł uzyskać dostęp do wartości z poprzedniego wiersza.

Możesz pominąć/zmodyfikować order by klauzula zgodnie z Twoimi wymaganiami.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zaktualizuj tabelę mysql za pomocą zapytania wybierającego z innej bazy danych

  2. MySQL BLOB a plik do przechowywania małych obrazów PNG?

  3. C# MySQL drugi DataReader w DataReader while loop

  4. PHP i MySQL najlepszy sposób na liczenie odsłon dla stron dynamicznych

  5. Jak przetestować instrukcję SQL Update przed jej uruchomieniem?