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

Bandingkan baris dalam tabel yang sama di mysql

Anda dapat melakukan "self-join" (menggabungkan tabel dengan dirinya sendiri) untuk melakukan kueri. Bagian yang sulit di sini adalah mengetahui urutan baris yang dimasukkan ke dalam tabel, dan hanya membandingkan baris yang secara berurutan (sementara) berdekatan. Saya berasumsi Anda memiliki semacam kolom TIMESTAMP yang akan memberi tahu Anda perubahan harga mana yang terjadi setelah yang sebelumnya. Jika tidak, mungkin "ID" dapat memberi tahu Anda tentang hal itu (baris ID yang lebih besar dimasukkan setelah ID yang lebih kecil).

Memanggil tabel Anda 'TAB', menggunakan 'TRADER' untuk menyediakan join, dan menggunakan 'ID' untuk menyediakan Order, kueri akan membutuhkan self-join tiga arah seperti berikut:

SELECT a.trader
     , SUM(IF(a.price > b.price, 1, 0)) nbr_incr
     , SUM(IF(a.price < b.price, 1, 0)) nbr_decr
     , SUM(IF(a.price = b.price, 1, 0)) nbr_same
  FROM tab a
  JOIN tab b 
    ON a.trader = b.trader AND a.id > b.id
  LEFT OUTER JOIN tab c 
    ON a.trader = c.trader AND a.id > c.id AND b.id < c.id
 WHERE c.id IS NULL
 GROUP BY a.trader

Kueri di atas menggabungkan tabel ke dirinya sendiri dua kali sehingga setiap tab mewakili yang berikut:

  • tab a :Baris terbaru untuk perbandingan
  • tab b :Baris sebelumnya untuk dibandingkan
  • tab c :Baris antara a &b menurut waktu (tidak boleh ada)

Kami melakukan LEFT OUTER JOIN ke 'tab c' karena kami sebenarnya tidak ingin baris itu ada. Dalam klausa where, kami memfilter hasil kami hanya ke hasil di mana baris 'tab c' tidak ada.

Terakhir, kueri melakukan 'GROUP BY' pada trader, dan SUM()s Kenaikan dan Penurunan dengan membandingkan harga dari baris 'a' dan 'b'.

Ini adalah tantangan yang menyenangkan. Semoga ini bisa membantu!

john...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan MySQL dengan Django - Akses ditolak untuk pengguna '@'localhost

  2. while ($row =mysql_fetch_array($result)) - berapa banyak loop yang dilakukan?

  3. Ambil TOP 10 Baris Tanpa Menggunakan TOP atau LIMIT? – Pertanyaan Wawancara Minggu Ini #247

  4. Aktivitas MySQL yang berlebihan

  5. Bagaimana cara meneruskan parameter ke panggilan balik kueri mysql di nodejs