sql >> Databasteknik >  >> RDS >> Mysql

Hur kan jag beräkna de högsta % dagliga prisändringarna med MySQL?

Ett problem som jag ser direkt är att använda en tidsstämpeldatatyp för datumet, detta kommer att komplicera din SQL-fråga av två skäl - du måste använda ett intervall eller konvertera till ett faktiskt datum i din where-klausul, men ännu viktigare , eftersom du uppger att du är intresserad av dagens stängningskurs och gårdagens stängningskurs, måste du hålla koll på de dagar då marknaden är öppen - så måndagens förfrågan är annorlunda än tis - fre, och vilken dag marknaden är stängd för en semester måste också redovisas.

Jag skulle lägga till en kolumn som mktDay och öka den varje dag som marknaden är öppen för affärer. Ett annat tillvägagångssätt kan vara att inkludera en kolumn 'föregåendeStäng' som gör din beräkning trivial. Jag inser att detta bryter mot normal form, men det sparar en dyr självanslutning i din fråga.

Om du inte kan ändra strukturen kommer du att göra en självanslutning för att få gårdagens slut och du kan beräkna % förändring och ordning med den % förändringen om du vill.

Nedan är Erics kod, rensad lite den kördes på min server som kör 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

Notera back-ticks eftersom några av dina kolumnnamn och Erics alias var reserverade ord.

Observera också att att använda en where-sats för den första tabellen skulle vara en billigare fråga - where get exekveras först och måste bara försöka ansluta sig själv på raderna som är större än noll och har dagens 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. Har någon hittat ett effektivt sätt att lagra BSON ObjectId-värden i en SQL-databas?

  2. Skriptet för MySQL-replikeringshälsokontroll

  3. Mysql hur man går med i tabeller

  4. MySQL:Hur beräknar man veckor ut från ett specifikt datum?