Jednym z problemów, który widzę od razu, jest użycie typu danych znacznika czasu dla daty, co skomplikuje zapytanie sql z dwóch powodów - będziesz musiał użyć zakresu lub przekonwertować na rzeczywistą datę w klauzuli where, ale co ważniejsze , ponieważ podasz, że interesuje Cię dzisiejsza cena zamknięcia i wczorajsza cena zamknięcia, będziesz musiał śledzić dni, w których rynek jest otwarty - więc zapytanie w poniedziałek jest inne niż wt - pt, a każdy dzień, w którym rynek jest zamknięty trzeba będzie również uwzględnić urlop.
Dodałbym kolumnę taką jak mktDay i zwiększał ją każdego dnia, w którym rynek jest otwarty dla biznesu. Innym podejściem może być dołączenie kolumny „poprzednieZamknij”, co sprawi, że obliczenia będą trywialne. Zdaję sobie sprawę, że narusza to normalną formę, ale oszczędza kosztownego sprzężenia w zapytaniu.
Jeśli nie możesz zmienić struktury, wykonasz sprzężenie własne, aby uzyskać wczorajsze zamknięcie i możesz obliczyć zmianę procentową i uporządkować według tej zmiany procentowej, jeśli chcesz.
Poniżej znajduje się kod Erica, trochę uporządkowany, który został wykonany na moim serwerze z 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
Zwróć uwagę na tylne znaczniki, ponieważ niektóre nazwy Twoich kolumn i aliasy Erica były słowami zastrzeżonymi.
Należy również pamiętać, że użycie klauzuli where dla pierwszej tabeli byłoby mniej kosztownym zapytaniem — funkcja where get jest wykonywana jako pierwsza i musi próbować połączyć się tylko w wierszach, które są większe od zera i mają dzisiejszą datę
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