sql >> Database teknologi >  >> RDS >> Mysql

Hvordan kan jeg beregne de øverste % daglige prisændringer ved hjælp af MySQL?

Et problem, som jeg umiddelbart ser, er at bruge en tidsstempeldatatype for datoen, dette vil komplicere din sql-forespørgsel af to grunde - du bliver nødt til at bruge et interval eller konvertere til en faktisk dato i din where-klausul, men endnu vigtigere , da du oplyser, at du er interesseret i dagens lukkekurs og gårsdagens lukkekurs, bliver du nødt til at holde styr på de dage, hvor markedet er åbent - så mandagens forespørgsel er anderledes end tirs - fre, og enhver dag markedet er lukket kl. en ferie skal også medregnes.

Jeg ville tilføje en kolonne som mktDay og øge den hver dag, markedet er åbent. En anden fremgangsmåde kan være at inkludere en 'forrigeLuk'-kolonne, som gør din beregning triviel. Jeg er klar over, at dette krænker normal form, men det sparer en dyr selvdeltagelse i din forespørgsel.

Hvis du ikke kan ændre strukturen, så vil du lave en selvtilslutning for at få gårsdagens tætte, og du kan beregne %-ændringen og rækkefølgen med den %-ændring, hvis du ønsker det.

Nedenfor er Erics kode, ryddet lidt op, den blev udført på min server, der kører 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

Bemærk tilbagekrydsningen, da nogle af dine kolonnenavne og Erics aliaser var reserverede ord.

Bemærk også, at brug af en where-klausul til den første tabel ville være en billigere forespørgsel - where get'et udføres først og skal kun forsøge at selv joine på rækker, der er større end nul og har dagens dato

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. varchar(255) vs tinytext/tinyblob og varchar(65535) vs blob/text

  2. 3 måder at liste alle triggere for en given tabel i PostgreSQL

  3. normalisering af karakterer med accent i MySQL-forespørgsler

  4. Yii2 viser data ved hjælp af hver sløjfe