Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak obliczyć najwyższe dzienne zmiany cen w % za pomocą MySQL?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - Dlaczego to zapytanie nie używa indeksu (zgodnie z wyjaśnieniem)

  2. Dlaczego MYSQL wyższe przesunięcie LIMIT spowalnia zapytanie?

  3. BŁĄD:Nie udało się zbudować natywnego rozszerzenia gem (mysql2 na szynach 3.2.3)

  4. Dlaczego ten kod pdo::mysql ulega awarii w systemie Windows?

  5. Jak zrobić pole NULL za pomocą narzędzi MySQL GUI?