Un problema que veo desde el principio es usar un tipo de datos de marca de tiempo para la fecha, esto complicará su consulta sql por dos razones:tendrá que usar un rango o convertir a una fecha real en su cláusula where, pero, lo que es más importante , dado que declara que está interesado en el precio de cierre de hoy y el precio de cierre de ayer, tendrá que realizar un seguimiento de los días en que el mercado está abierto; también se tendrá que contabilizar un día festivo.
Agregaría una columna como mktDay y la incrementaría cada día que el mercado esté abierto para los negocios. Otro enfoque podría ser incluir una columna 'previousClose' que hace que su cálculo sea trivial. Me doy cuenta de que esto viola la forma normal, pero ahorra una autounión costosa en su consulta.
Si no puede cambiar la estructura, realizará una autocombinación para obtener el cierre de ayer y podrá calcular el % de cambio y ordenar según ese % de cambio si lo desea.
A continuación se muestra el código de Eric, se limpió un poco y se ejecutó en mi servidor 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
Fíjese en las tildes invertidas ya que algunos de los nombres de sus columnas y los alias de Eric eran palabras reservadas.
También tenga en cuenta que usar una cláusula where para la primera tabla sería una consulta menos costosa:el where get se ejecuta primero y solo tiene que intentar unirse en las filas que son mayores que cero y tienen la fecha de hoy
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