【发布时间】:2019-05-29 15:43:06
【问题描述】:
请帮助我优化我的 SQL 查询。
我有一个包含以下字段的表:date、commercial_id、exp_month_id、exp_year、price,其中前 4 个字段是主键。月份用按字母顺序排列的字母指定:例如F(一月)、G(二月)、H(三月)等。因此,距离一月较远的月份的字母将大于距离较近的月份的字母(F
我需要根据 exp_month_id、exp_year 计算相邻记录的价格(梯度)之间的差异。作为第一步,我想为每对夫妇 (exp_month_id, exp_year) 定义有效的夫妇 (next_month_id, next_year)。这里的主要问题是,如果当前的 exp_month_id 是一年中的最后一个,那么 next_year = exp_year + 1 和 next_month_id 应该是一年中的第一个。
我编写了以下查询来完成这项工作:
WITH trading_months AS (
SELECT DISTINCT commodity_id,
exp_month_id
FROM futures
ORDER BY exp_month_id
)
SELECT DISTINCT f.commodity_id,
f.exp_month_id,
f.exp_year,
(
WITH [temp] AS (
SELECT exp_month_id
FROM trading_months
WHERE commodity_id = f.commodity_id
)
SELECT exp_month_id
FROM [temp]
WHERE exp_month_id > f.exp_month_id
UNION ALL
SELECT exp_month_id
FROM [temp]
LIMIT 1
)
AS next_month_id,
(
SELECT CASE WHEN EXISTS (
SELECT commodity_id,
exp_month_id
FROM trading_months
WHERE commodity_id = f.commodity_id AND
exp_month_id > f.exp_month_id
LIMIT 1
)
THEN f.exp_year ELSE f.exp_year + 1 END
)
AS next_year
FROM futures AS f
此查询用作动态表(视图)的基础,该表随后用于计算梯度。但是,此查询的执行需要一秒钟以上,因此整个过程需要几分钟。我想知道您是否可以帮我优化查询。
【问题讨论】:
-
@Shawn 不幸的是,没有。