Satu masalah yang saya lihat langsung adalah menggunakan tipe data stempel waktu untuk tanggal, ini akan memperumit kueri sql Anda karena dua alasan - Anda harus menggunakan rentang atau mengonversi ke tanggal aktual di klausa where Anda, tetapi, yang lebih penting , karena Anda menyatakan bahwa Anda tertarik dengan harga penutupan hari ini dan harga penutupan kemarin, Anda harus melacak hari-hari ketika pasar buka - jadi kueri hari Senin berbeda dari sel - Jumat, dan hari apa pun pasar tutup untuk liburan juga harus diperhitungkan.
Saya akan menambahkan kolom seperti mktDay dan menambahkannya setiap hari pasar terbuka untuk bisnis. Pendekatan lain mungkin dengan memasukkan kolom 'previousClose' yang membuat perhitungan Anda menjadi sepele. Saya menyadari ini melanggar bentuk normal, tetapi ini menghemat biaya gabung sendiri dalam kueri Anda.
Jika Anda tidak dapat mengubah struktur, maka Anda akan melakukan self join untuk mendapatkan penutupan kemarin dan Anda dapat menghitung % perubahan dan memesan dengan % perubahan tersebut jika diinginkan.
Di bawah ini adalah kode Eric, dibersihkan sedikit yang dieksekusi di server saya yang menjalankan mysql 5.0.27
select
p_today.`ticker`,
p_today.`date`,
p_yest.price as `open`,
p_today.price as `close`,
((p_today.price - p_yest.price)/p_yest.price) as `change`
from
prices p_today
inner join prices p_yest on
p_today.ticker = p_yest.ticker
and date(p_today.`date`) = date(p_yest.`date`) + INTERVAL 1 DAY
and p_today.price > 0
and p_yest.price > 0
and date(p_today.`date`) = CURRENT_DATE
order by `change` desc
limit 10
Perhatikan tanda centang kembali karena beberapa nama kolom Anda dan alias Eric adalah kata-kata yang dicadangkan.
Perhatikan juga bahwa menggunakan klausa where untuk tabel pertama akan menjadi kueri yang lebih murah - di mana get dieksekusi terlebih dahulu dan hanya perlu mencoba untuk bergabung sendiri pada baris yang lebih besar dari nol dan memiliki tanggal hari ini
select
p_today.`ticker`,
p_today.`date`,
p_yest.price as `open`,
p_today.price as `close`,
((p_today.price - p_yest.price)/p_yest.price) as `change`
from
prices p_today
inner join prices p_yest on
p_today.ticker = p_yest.ticker
and date(p_today.`date`) = date(p_yest.`date`) + INTERVAL 1 DAY
and p_yest.price > 0
where p_today.price > 0
and date(p_today.`date`) = CURRENT_DATE
order by `change` desc
limit 10