Ett problem som jag ser direkt är att använda en tidsstämpeldatatyp för datumet, detta kommer att komplicera din SQL-fråga av två skäl - du måste använda ett intervall eller konvertera till ett faktiskt datum i din where-klausul, men ännu viktigare , eftersom du uppger att du är intresserad av dagens stängningskurs och gårdagens stängningskurs, måste du hålla koll på de dagar då marknaden är öppen - så måndagens förfrågan är annorlunda än tis - fre, och vilken dag marknaden är stängd för en semester måste också redovisas.
Jag skulle lägga till en kolumn som mktDay och öka den varje dag som marknaden är öppen för affärer. Ett annat tillvägagångssätt kan vara att inkludera en kolumn 'föregåendeStäng' som gör din beräkning trivial. Jag inser att detta bryter mot normal form, men det sparar en dyr självanslutning i din fråga.
Om du inte kan ändra strukturen kommer du att göra en självanslutning för att få gårdagens slut och du kan beräkna % förändring och ordning med den % förändringen om du vill.
Nedan är Erics kod, rensad lite den kördes på min server som kör 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
Notera back-ticks eftersom några av dina kolumnnamn och Erics alias var reserverade ord.
Observera också att att använda en where-sats för den första tabellen skulle vara en billigare fråga - where get exekveras först och måste bara försöka ansluta sig själv på raderna som är större än noll och har dagens datum
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