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