sql >> Databáze >  >> RDS >> Mysql

Jak mohu vypočítat nejvyšší % denních cenových změn pomocí MySQL?

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


  1. pouze data mysqldump

  2. O Neo4j

  3. Testování připojení k databázi Entity Framework

  4. Zařízení pro obnovu s nulovou ztrátou dat