mysql - 加快加入字符串字段
问题描述
我有一个表,其中包含如下 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
解决方案
如果您想与一年前有所不同,请使用窗口函数。不过,在此之前,请修复数据模型!不要将日期存储为字符串。所以:
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。
推荐阅读
- asp.net-core - 在组件文档中添加TagHelper
- firebase - 从 Firestore 的集合中获取多个特定数据的最佳方法是什么?
- html - iFrame 不显示 PDF 页面
- performance - 如何使用 pyspark 提高 csv 到 parquet 文件格式的性能?
- django - 在 django 中使用 scss:scss 在 CACHE “应用”中编译成 css,但默认情况下“覆盖”引导主题
- ios - UIStackView 中的按钮不可点击
- java - (Java) 字符 'é' 在 JTextArea 中显示错误
- javascript - PWA 工作箱后台同步队列请求队列对象可访问性
- php - 如何在 woo commerce 的结帐表单字段中删除额外的 div html 类
- java - Selenium 问题:过时的元素参考:元素未附加到页面文档 - 单击预期文本后