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

标签 sql mysql

我有一个名为 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 的任何东西的价格下降百分比。随着时间的推移,这张 table 会很大,我担心性能。我认为这必须在 MySQL 端而不是 PHP 端完成,因为此处需要 LIMIT

不过,如何获取最后 2 个日期并在 MySQL 中计算下降百分比?

如有任何建议,我们将不胜感激。

最佳答案

我马上看到的一个问题是对日期使用时间戳数据类型,这会使您的 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

关于sql - 如何使用 MySQL 计算每日价格变化的最高百分比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1250675/

相关文章:

mysql - 将 CSV 导入 MySQL 时遇到困难

php - 带有 codeigniter 问题的数据库缓存

java - ' sys.objects ' 附近的语法不正确

mysql - 如果有多个识别标准,如何使用 WHERE 从 Mysql 数据库中获取结果?

php - 存储/显示重复每周计划的方法

用于获取 Facebook 点赞的 PHP 代码不再起作用

php - MySQL 增长变化之和与增长顺序

mysql - 通过引用主键来识别数据集中特定行的行索引

sql - 如何在postgresql中的单个函数中编写多个查询

mysql - SQL 按 DATENAME 分组