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...