首页 > 解决方案 > 加快加入字符串字段

问题描述

我有一个表,其中包含如下 tableA 示例的数据。日期列被格式化为字符串。close 列是一个整数,ticker 被格式化为字符串。
我正在尝试在 mysql 数据库上运行下面的查询,这需要很长时间。我能做些什么来加快速度,比如更改日期列的格式,或者添加索引或主键?ticker 和 date 的组合应该是一个唯一的值,而 date 字段是一个时间戳,它目前只是格式化为字符串。

代码:

select avg((a.close-b.close)/b.close) as avg_annual_returns,
a.ticker
from tableA a 
join tableA b
on cast(a.date as date)=date_add(cast(b.date as date),interval 365 DAY)
and a.ticker=b.ticker
where b.close is not null
group by a.ticker

表A

+--------+-----+------+
|date    |close|ticker|
+--------+-----+------+
|2/1/2019|5    |abc   |
+--------+-----+------+
|2/3/2019|7    |efd   |
+--------+-----+------+
|2/4/2019|3    |hij   |
+--------+-----+------+

更新答案:

select ticker,date, ( -1 +
        a.close / max(a.close) over (partition by ticker 
                                     order by date
                                     range between interval 365 day preceding and interval 365 day preceding
                                    ) 
       ) as annual_returns              
from tableA a
) b where annual_returns is not null
group by ticker

标签: mysqlsqldatetimemysql-workbenchquery-optimization

解决方案


如果您想与一年前有所不同,请使用窗口函数。不过,在此之前,请修复数据模型!不要将日期存储为字符串。所以:

alter table talbeA modify column date date;

然后从一年前开始:

select( -1 +
        a.close / max(a.close) over (partition by ticker 
                                     order by date
                                     range between interval 365 day preceding and interval 365 day preceding
                                    )
       )               
from tablea a;

您不必担心NULL值,因为AVG()忽略它们。

是一个 db<>fiddle。


推荐阅读