Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да получите разликата между последователни редове в MySQL?

За MySQL 8 след това използвайте Lag функция прозорец.

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

За MySQL 5.7 или по-ниска версия

Можем да използваме променливата MySQL да свърши тази работа. Имайте предвид, че името на вашата таблица е 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  |

Обяснение:

  • (SELECT @prev_number:= 0 AS num) AS b инициализирахме променлива @prev_number до нула в клаузата FROM и се съединява с всеки ред от теста маса.
  • @diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff Първо генерираме разлика и след това създаваме друга променлива diff да го използвате повторно за изчисление на средната стойност. Също така включихме едно условие, за да направим разликата за първия ред като нула.
  • @prev_number:= test.number as dummy задаваме текущномер към тази променлива, така че да може да се използва от следващия ред.

Забележка :Първо трябва да използваме тази променлива и в двете разлики както исредното и след това задайте новата стойност, така че следващият ред да има достъп до стойността от предишния ред.

Можете да пропуснете/промените order by клауза според вашите изисквания.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да покажа реда на таблицата на mysql като колона

  2. MySQL оптимизация на огромна таблица

  3. MySQL Вмъкване и присъединяване

  4. Не мога да създам модел на данни за обект - използвайки MySql и EF6

  5. Връщане на blob с json