Mysql
 sql >> база данни >  >> RDS >> Mysql

Как мога да изчисля най-високия % дневни промени в цената с MySQL?

Един проблем, който виждам веднага, е използването на тип данни за времеви отпечатък за датата, това ще усложни вашата 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Връщане на връщане на база данни Грешка при премахване на база данни errno:66 в MySQL

  2. MySQL - Не може да се добави или актуализира дъщерен ред:ограничение на външния ключ е неуспешно

  3. Mysql заявката работи добре на работната маса, но отнема твърде много време в r

  4. MySQL Изберете и това, и това

  5. Примери за ЛОКАЛНО ВРЕМЕ – MySQL