Um problema que vejo logo de cara é usar um tipo de dados timestamp para a data, isso complicará sua consulta sql por dois motivos - você terá que usar um intervalo ou converter para uma data real em sua cláusula where, mas, mais importante , já que você afirma que está interessado no preço de fechamento de hoje e no preço de fechamento de ontem, você terá que acompanhar os dias em que o mercado está aberto - portanto, a consulta de segunda-feira é diferente de terça-feira e qualquer dia em que o mercado estiver fechado para um feriado terá que ser contabilizado também.
Eu adicionaria uma coluna como mktDay e a incrementaria a cada dia que o mercado estivesse aberto para negócios. Outra abordagem pode ser incluir uma coluna 'previousClose' que torna seu cálculo trivial. Eu percebo que isso viola a forma normal, mas economiza uma autojunção cara em sua consulta.
Se você não puder alterar a estrutura, você fará uma auto-junção para obter o fechamento de ontem e poderá calcular a % de alteração e ordenar por essa % de alteração, se desejar.
Abaixo está o código do Eric, limpo um pouco e executado no meu servidor executando o 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
Observe os back-ticks, pois alguns de seus nomes de coluna e os apelidos de Eric eram palavras reservadas.
Observe também que usar uma cláusula where para a primeira tabela seria uma consulta mais barata - o where get é executado primeiro e só precisa tentar se unir nas linhas que são maiores que zero e têm a data de hoje
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