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

Bagaimana cara menghitung % perubahan harga harian teratas menggunakan MySQL?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pilih bagian dari MySQL Blob Field

  2. Cara mengatur batas waktu koneksi tergantung dari login pengguna di MySQL

  3. Nilai pengembalian MySQL yang rapi

  4. Mysql Bandingkan dua bidang datetime

  5. MySQL:Berapa banyak kueri per halaman yang terlalu banyak?