Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara mendapatkan perbedaan antara baris berurutan di MySQL?

Untuk MySQL 8 lalu gunakan Lag fungsi jendela.

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

Untuk MySQL 5.7 atau versi yang lebih rendah

Kita dapat menggunakan variabel MySQL untuk melakukan pekerjaan ini. Pertimbangkan nama tabel Anda adalah 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  |

Penjelasan:

  • (SELECT @prev_number:= 0 AS num) AS b kami menginisialisasi variabel @prev_number ke nol dalam klausa FROM dan bergabung dengan setiap baris pengujian meja.
  • @diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff Pertama kita membuat perbedaan dan kemudian membuat variabel lain diff untuk menggunakannya kembali untuk perhitungan rata-rata. Kami juga menyertakan satu syarat untuk membuat perbedaan untuk baris pertama menjadi nol.
  • @prev_number:= test.number as dummy kita sedang menyetel angka current ke variabel ini, sehingga dapat digunakan oleh baris berikutnya.

Catatan :Kita harus menggunakan variabel ini terlebih dahulu, baik dalam difference serta rata-rata lalu setel ke nilai baru, sehingga baris berikutnya dapat mengakses nilai dari baris sebelumnya.

Anda dapat melewati/memodifikasi order by klausul sesuai kebutuhan Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masukkan ke dalam tabel yang memiliki tanda hubung pada namanya

  2. Tidak dapat terhubung ke server MySQL lokal melalui soket '/var/lib/mysql/mysql.sock' (2)

  3. Masukkan beberapa baris ke dalam database MySQL dari sebuah tabel

  4. Laravel Fasih dengan()-> mengembalikan null

  5. Cara Menyisipkan data dari satu tabel database ke tabel database lain di Mysql