小编典典

如何使用MySQL计算最高的每日价格变化百分比?

sql

我有一个表格prices,其中包含我每天跟踪的股票收盘价。

这是模式:

CREATE TABLE `prices` (
  `id` int(21) NOT NULL auto_increment,
  `ticker` varchar(21) NOT NULL,
  `price` decimal(7,2) NOT NULL,
  `date` timestamp NOT NULL default CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`),
  KEY `ticker` (`ticker`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2200 ;

我正在尝试计算今天和昨天价格大于0的任何商品的价格下跌百分比。随着时间的流逝,这张桌子会很大,我担心性能。我认为这将必须在MySQL方面而不是PHP上完成,因为LIMIT这是必需的。

如何获取最近2个日期,但是如何在MySQL中进行%跌落计算?

任何建议将不胜感激。


阅读 307

收藏
2021-04-22

共1个答案

小编典典

我马上就想到的一个问题是使用时间戳数据类型作为日期,这会使SQL查询复杂化,这有两个原因-
您必须在where子句中使用范围或将其转换为实际日期,但是更重要的是,因为您声明对今天的收盘价和昨天的收盘价感兴趣,所以您必须跟踪市场开盘的日子-
因此,周一的查询与星期二不同-周五,以及市场在闭市的任何一天一个假期也必须考虑在内。

我会添加一个像mktDay这样的列,并在每天市场开放时增加它。另一种方法可能是包括一个“
previousClose”列,该列使您的计算变得微不足道。我意识到这违反了正常形式,但是在您的查询中节省了昂贵的自我联接。

如果您无法更改结构,那么您将进行自我联接以获取昨天的收盘价,并且您可以根据需要计算百分比变化和按百分比变化排序。

以下是埃里克(Eric)的代码,对它在运行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

请注意反引号,因为您的某些列名和Eric的别名是保留字。

还要注意的是,对第一个表使用where子句将是一个开销较小的查询-首先执行where get,并且仅需尝试对大于零且具有今天日期的行进行自我联接

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
2021-04-22