sql >> Database >  >> RDS >> Mysql

Hoe kan ik het hoogste % dagelijkse prijswijzigingen berekenen met MySQL?

Een probleem dat ik meteen zie, is het gebruik van een tijdstempelgegevenstype voor de datum, dit zal uw sql-query om twee redenen bemoeilijken:u moet een bereik gebruiken of converteren naar een werkelijke datum in uw waar-clausule, maar, nog belangrijker , aangezien u aangeeft geïnteresseerd te zijn in de slotkoers van vandaag en de slotkoers van gisteren, moet u de dagen bijhouden waarop de markt open is - dus de vraag van maandag is anders dan di - vr, en elke dag dat de markt gesloten is voor er moet ook rekening worden gehouden met een vakantie.

Ik zou een kolom zoals mktDay toevoegen en deze elke dag verhogen dat de markt open is voor zaken. Een andere benadering kan zijn om een ​​kolom 'vorigeSluiten' op te nemen, waardoor uw berekening triviaal wordt. Ik realiseer me dat dit in strijd is met de normale vorm, maar het bespaart een dure zelf-deelname aan uw zoekopdracht.

Als je de structuur niet kunt veranderen, dan doe je een self-join om de slotkoers van gisteren te krijgen en kun je de % verandering berekenen en desgewenst met die % verandering bestellen.

Hieronder staat de code van Eric, een beetje opgeschoond en uitgevoerd op mijn server met 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

Let op de back-ticks, aangezien sommige van uw kolomnamen en Eric's aliassen gereserveerde woorden waren.

Houd er ook rekening mee dat het gebruik van een where-clausule voor de eerste tabel een minder dure query zou zijn - de where get wordt eerst uitgevoerd en hoeft alleen te proberen zichzelf aan te sluiten op de rijen die groter zijn dan nul en de datum van vandaag hebben

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. Hoe vaak moet ik databaseverbindingen sluiten?

  2. Wat is de opslaggrootte van BIT(1)?

  3. Java - datum opgeslagen als de dag ervoor

  4. ZDLRA – RMAN-20035 ongeldige hoge RECID