MySql 如何使用窗口函数加速工作查询

问题描述

编辑:实际上,主要问题是上次更新设置 A.last_52w_high_age_brutto_days(见下文)。是否可以优化此更新或以某种方式集成到 CURSOR 更新中?谢谢。


我有一张股票市场每日价格表。

表格结构:

res <- df %>% group_by(p_id) %>% group_by(stimuli_length) %>%
  select(value) %>% rowwise() %>% mutate(sum = sum(value))

插入语句:

CREATE TABLE `cind_stocks_daily_rates` (
  `symbol` varchar(12) NOT NULL,`p_date` int unsigned NOT NULL,`open_price` decimal(9,4) NOT NULL,`high_price` decimal(9,`low_price` decimal(9,`close_price` decimal(9,`price_52w_low` decimal(9,4) DEFAULT NULL,`price_52w_high` decimal(9,`last_52w_high_age_brutto_days` int unsigned DEFAULT NULL,PRIMARY KEY (`symbol`,`p_date `)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

想要的结果:

INSERT INTO cind_stocks_daily_rates (symbol,datum,open_price,high_price,low_price,close_price,price_52w_low,price_52w_high,last_52w_high_age_brutto_days)
VALUES
('DELL',20210616,150,152,149,151,0),('INTZ',250,252,249,251,('MSFT',350,352,349,351,('NTNX',452,449,451,('DELL',20210617,148,147,1),254,346,345,347,450,454,453,20210618,146,144,145,NULL,NULL),256,253,255,456,NULL);

在我用给定日期的价格/费率填充表格后,我想计算过去 52 周的高和低费率 - 以及过去 52 周高价的一天之间的持续时间和值日期列。

我创建了一个游标:

symbol  datum   open_price  high_price  low_price   close_price price_52w_low   price_52w_high  last_52w_high_age_brutto_days
DELL    20210616    150 152 149 151 149 152 0
INTZ    20210616    250 252 249 251 249 252 0
MSFT    20210616    350 352 349 351 349 352 0
NTNX    20210616    452 452 449 451 449 452 0
DELL    20210617    148 151 147 150 147 152 1
INTZ    20210617    251 254 250 252 249 254 0
MSFT    20210617    346 349 345 347 345 352 1
NTNX    20210617    450 454 450 453 449 454 0
DELL    20210618    146 147 144 145 144 152 2
INTZ    20210618    254 256 253 255 249 256 0
MSFT    20210618    349 351 349 350 345 352 2
NTNX    20210618    453 456 452 454 449 456 0

并通过光标(curr_symbol)循环符号:

SELECT distinct symbol FROM cind_stocks_daily_rates
WHERE  price_52w_low IS NULL OR price_52w_high IS NULL;

在游标循环之后,我有另一个更新来确定从今天开始的当前 52 周高价:

编辑:实际上,更新后是我的主要问题(也是唯一的问题)。持续时间约+/- 10 分钟。 END_OF_EDIT

UPDATE cind_stocks_daily_rates AS A
CROSS JOIN
(SELECT AA.p_date,AA.symbol,Min(AA.low_price) OVER (ORDER BY AA.p_date ROWS BETWEEN 260 PRECEDING AND CURRENT ROW) AS low_price_52w,Max(AA.high_price) OVER (ORDER BY AA.p_date ROWS BETWEEN 260 PRECEDING AND 
CURRENT ROW) AS high_price_52w
FROM cind_stocks_daily_rates AA
WHERE AA.symbol = curr_symbol
ORDER BY AA.p_date) as B ON B.symbol = A.symbol AND B.p_date = A.p_date
SET A.price_52w_low = B.low_price_52w,A.price_52w_high = B.high_price_52w,WHERE  A.price_52w_low IS NULL OR A.price_52w_high IS NULL;

它可以按需要运行而没有错误,只是需要太多时间。有没有可能加快速度?是否可以在游标内一起设置字段“last_52w_high_age_brutto_days”(游标循环后没有第二次更新)?请问有什么办法可以加快查询速度吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...