Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso calcolare la % di variazioni di prezzo giornaliere più elevate utilizzando MySQL?

Un problema che vedo subito è l'utilizzo di un tipo di dati timestamp per la data, questo complicherà la tua query sql per due motivi:dovrai utilizzare un intervallo o convertire in una data effettiva nella tua clausola where, ma, cosa più importante , poiché dichiari di essere interessato al prezzo di chiusura di oggi e al prezzo di chiusura di ieri, dovrai tenere traccia dei giorni in cui il mercato è aperto, quindi la query di lunedì è diversa da mar - ven e ogni giorno il mercato è chiuso per dovrà essere contabilizzata anche una vacanza.

Aggiungerei una colonna come mktDay e la aumenterei ogni giorno in cui il mercato è aperto agli affari. Un altro approccio potrebbe essere quello di includere una colonna "precedenteChiudi" che rende il calcolo banale. Mi rendo conto che questo viola la forma normale, ma risparmia un costoso self join nella tua query.

Se non puoi cambiare la struttura, farai un self join per ottenere la chiusura di ieri e potrai calcolare la variazione percentuale e ordinare in base a quella variazione%, se lo desideri.

Di seguito è riportato il codice di Eric, ripulito un po' che è stato eseguito sul mio server con 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

Nota i segni di spunta indietro poiché alcuni dei nomi delle tue colonne e gli alias di Eric erano parole riservate.

Si noti inoltre che l'utilizzo di una clausola where per la prima tabella sarebbe una query meno costosa:il get where viene eseguito per primo e deve solo tentare di unire automaticamente le righe che sono maggiori di zero e hanno la data odierna

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