Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como posso calcular as principais % de alterações diárias de preços usando o MySQL?


Um problema que vejo logo de cara é usar um tipo de dados timestamp para a data, isso complicará sua consulta sql por dois motivos - você terá que usar um intervalo ou converter para uma data real em sua cláusula where, mas, mais importante , já que você afirma que está interessado no preço de fechamento de hoje e no preço de fechamento de ontem, você terá que acompanhar os dias em que o mercado está aberto - portanto, a consulta de segunda-feira é diferente de terça-feira e qualquer dia em que o mercado estiver fechado para um feriado terá que ser contabilizado também.

Eu adicionaria uma coluna como mktDay e a incrementaria a cada dia que o mercado estivesse aberto para negócios. Outra abordagem pode ser incluir uma coluna 'previousClose' que torna seu cálculo trivial. Eu percebo que isso viola a forma normal, mas economiza uma autojunção cara em sua consulta.

Se você não puder alterar a estrutura, você fará uma auto-junção para obter o fechamento de ontem e poderá calcular a % de alteração e ordenar por essa % de alteração, se desejar.

Abaixo está o código do Eric, limpo um pouco e executado no meu servidor executando o 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

Observe os back-ticks, pois alguns de seus nomes de coluna e os apelidos de Eric eram palavras reservadas.

Observe também que usar uma cláusula where para a primeira tabela seria uma consulta mais barata - o where get é executado primeiro e só precisa tentar se unir nas linhas que são maiores que zero e têm a data de hoje
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