Един проблем, който виждам веднага, е използването на тип данни за времеви отпечатък за датата, това ще усложни вашата sql заявка по две причини - ще трябва да използвате диапазон или да конвертирате в действителна дата във вашата клауза where, но по-важното е , тъй като заявявате, че се интересувате от днешната цена на затваряне и вчерашната цена на затваряне, ще трябва да следите дните, в които пазарът е отворен - така че заявката за понеделник е различна от вт - пт, и всеки ден пазарът е затворен за ще трябва да се отчете и празник.
Бих добавил колона като mktDay и бих я увеличавал всеки ден, когато пазарът е отворен за бизнес. Друг подход може да бъде включването на колона 'previousClose', което прави изчислението ви тривиално. Разбирам, че това нарушава нормалната форма, но спестява скъпо самостоятелно присъединяване към вашата заявка.
Ако не можете да промените структурата, тогава ще направите самостоятелно присъединяване, за да завършите вчерашния ден и можете да изчислите % промяната и да подредите по тази % промяна, ако желаете.
По-долу е кодът на Ерик, почистен малко, изпълняван на моя сървър, работещ с 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
Обърнете внимание на отметките, тъй като някои от имената на колоните ви и псевдоними на Ерик са запазени думи.
Също така имайте предвид, че използването на клауза where за първата таблица би било по-евтина заявка - where get се изпълнява първо и трябва да се опита само да се присъедини към редовете, които са по-големи от нула и имат днешна дата
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