sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo puedo calcular el % máximo de cambios de precio diarios usando MySQL?

Un problema que veo desde el principio es usar un tipo de datos de marca de tiempo para la fecha, esto complicará su consulta sql por dos razones:tendrá que usar un rango o convertir a una fecha real en su cláusula where, pero, lo que es más importante , dado que declara que está interesado en el precio de cierre de hoy y el precio de cierre de ayer, tendrá que realizar un seguimiento de los días en que el mercado está abierto; también se tendrá que contabilizar un día festivo.

Agregaría una columna como mktDay y la incrementaría cada día que el mercado esté abierto para los negocios. Otro enfoque podría ser incluir una columna 'previousClose' que hace que su cálculo sea trivial. Me doy cuenta de que esto viola la forma normal, pero ahorra una autounión costosa en su consulta.

Si no puede cambiar la estructura, realizará una autocombinación para obtener el cierre de ayer y podrá calcular el % de cambio y ordenar según ese % de cambio si lo desea.

A continuación se muestra el código de Eric, se limpió un poco y se ejecutó en mi servidor con 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

Fíjese en las tildes invertidas ya que algunos de los nombres de sus columnas y los alias de Eric eran palabras reservadas.

También tenga en cuenta que usar una cláusula where para la primera tabla sería una consulta menos costosa:el where get se ejecuta primero y solo tiene que intentar unirse en las filas que son mayores que cero y tienen la fecha de hoy

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