Jeden problém, který hned vidím, je použití datového typu časového razítka pro datum, což zkomplikuje váš dotaz SQL ze dvou důvodů – budete muset použít rozsah nebo převést na skutečné datum ve vaší klauzuli where, ale co je důležitější , jelikož uvádíte, že vás zajímá dnešní zavírací cena a včerejší zavírací cena, budete si muset hlídat dny, kdy je trh otevřený - takže pondělní dotaz je jiný než út - pá a kterýkoli den je trh uzavřen na bude nutné zaúčtovat i dovolenou.
Přidal bych sloupec jako mktDay a zvýšil bych jej každý den, kdy je trh otevřený pro podnikání. Dalším přístupem může být zahrnutí sloupce 'previousClose', díky kterému je výpočet triviální. Uvědomuji si, že to porušuje normální formu, ale ušetří to drahé vlastní připojení k vašemu dotazu.
Pokud nemůžete změnit strukturu, provedete vlastní připojení, abyste získali včerejší uzávěrku a můžete vypočítat % změny a pořadí podle této % změny, pokud chcete.
Níže je Ericův kód, trochu vyčištěný, který se spustil na mém serveru se systémem 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
Všimněte si zpětných znamének, protože některé názvy sloupců a Ericovy aliasy byly vyhrazená slova.
Všimněte si také, že použití klauzule where pro první tabulku by bylo levnějším dotazem – dotaz where get se provede jako první a pouze se musí pokusit o vlastní spojení na řádcích, které jsou větší než nula a mají dnešní 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