如何解决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 举报,一经查实,本站将立刻删除。