我有一张包含股票信息的表格,我正在计算每个股票的百分比变化的几个数据点。计算这个的公式非常简单
(今日收盘价 - 昨日及收盘价)/昨日收盘价* 100
所以今天收盘价为12美元,昨日收盘价为10美元的股票将是
($ 12 - $ 10)/ $ 10 * 100 = 2/10 * 100 = + 20%
计算每日百分比变化很容易,但我还需要计算每周,每月,每月,每年等百分比变化。
因此,在7天前计算出前一个收盘价的一个复杂因素可能是假期或周末,或者当天股票没有交易,所以我必须在1周之前选择最近一个交易日前。
选项1 - 使用光标。
我可以选择一个股票列表,然后循环浏览它们和每个股票,从一周前获得最近的交易日并获得当天的收盘价。进行计算并更新我的表格。转到下一个股票。这似乎可行,但速度较慢。如果可能,我想尝试选项2。
选项2 - 在带有子查询的查询中执行
单个查询
UPDATE todaysdata a, historicaldata b
SET a.1weekpercentchange =
((a.closetrade - .closetrade) / b.closetrade) * 100)
WHERE a.stockid = b.stockid
AND b.tradedate = (
SELECT max(tradedate)
FROM historicaldatatable
WHERE tradedate <= date_sub(now(), interval 7 day)
WHERE stockid=a.stockid);
todaysData表包含大约15000条记录。每个股票一个。历史数据包含大约50万条记录,每条库存有多条记录。例如,Apple在历史表中每年有200行* x年的数据。
我发现选项2的运行速度非常慢。有没有更快的方法来执行此查询?