Sql 查找最接近日期的数据?

Sql 查找最接近日期的数据?,sql,mysql,select,datediff,Sql,Mysql,Select,Datediff,我有一张桌子 CREATE TABLE `symbol_details` ( `symbol_header_id` int(11) DEFAULT NULL, `DATE` datetime DEFAULT NULL, `ADJ_NAV` double DEFAULT NULL ) 大约有20000000个条目。现在,我想为一个符号头id找到最接近季度末的ADJ_NAV值: SET @quarterend = '2009-3-31'; SELECT symbol_header_

我有一张桌子

CREATE TABLE `symbol_details` (
  `symbol_header_id` int(11) DEFAULT NULL,
  `DATE` datetime DEFAULT NULL,
  `ADJ_NAV` double DEFAULT NULL
)
大约有20000000个条目。现在,我想为一个符号头id找到最接近季度末的ADJ_NAV值:

SET @quarterend = '2009-3-31';

SELECT  symbol_header_id AS she, ADJ_NAV AS aend FROM symbol_details
WHERE
 symbol_header_id = 18546 
 AND DATE= (
# date closest after quarter end
SELECT DATE FROM symbol_details
WHERE ABS(DATEDIFF(DATE, @quarterend)) < 10
AND DATE<=@quarterend
AND symbol_header_id = 18546 
ORDER BY  ABS(DATEDIFF(DATE, @quarterend)) ASC LIMIT 1)

当我运行内部选择日期查询时,它会快速返回。只需使用正确的日期而不是子查询来运行外部查询也可以很快完成。但当我运行整个过程时,它需要永远——有什么地方出了问题

您可能不需要子查询。抓住第一排:

SELECT *
FROM symbol_details
WHERE DATE <= @quarterend
AND symbol_header_id = 18546
ORDER BY DATE DESC
LIMIT 1

您可能不需要子查询。抓住第一排:

SELECT *
FROM symbol_details
WHERE DATE <= @quarterend
AND symbol_header_id = 18546
ORDER BY DATE DESC
LIMIT 1

似乎优化器在正确评估语句并找到最有效的计划方面存在一些问题。在Oracle中,我会要求您更新统计数据,但我不确定优化器在MySQL中是如何工作的

我会尝试其他一些方式来表达您的陈述,看看什么对优化器最有意义:

显式连接immer和外部查询的两个符号头ID 请尝试选择maxdate。。而不是“按限制1订购” 尝试对symbol\u详细信息进行自连接
希望这里有一个有用的想法。

似乎优化器在正确评估语句并找到最有效的计划方面存在一些问题。在Oracle中,我会要求您更新统计数据,但我不确定优化器在MySQL中是如何工作的

我会尝试其他一些方式来表达您的陈述,看看什么对优化器最有意义:

显式连接immer和外部查询的两个符号头ID 请尝试选择maxdate。。而不是“按限制1订购” 尝试对symbol\u详细信息进行自连接 希望这里有一个有用的想法。

试试:

   SELECT t.symbol_header_id,
          COALESCE(t.adj_nav, '0.0') 'adj_nav'
     FROM SYMBOL_DETAILS t
LEFT JOIN (SELECT sh.symbol_header_id,
                  MAX(sh.date) 'max_date'
             FROM SYMBOL_DETAILS sh
            WHERE ABS(DATEDIFF(sh.date, @quarter_end)) < 10
              AND sh.date <= @quarter_end) x ON x.symbol_header_id = t.symbol_header_id
                                            AND x.max_date = t.date
   WHERE t.symbol_header_id = 18546
尝试:


这是真的,但问题是,如果没有该季度的数据,它将返回非常旧的数据。但我可以只添加和日期>@quarterstart。。。让我试试。谢谢你的回复!!这很好,让我找到了解决方案,请看我在正在进行的原始帖子中的咆哮,但我不得不将其更改为group by,以获取所有值。但现在还有另一个问题…@Martin Stein:我甚至不确定GROUP BY symbol_header_id DESC是做什么的,所以我会在一个新问题中问这个问题,这是真的,但问题是如果没有该季度的数据,它将返回非常旧的数据。但我可以只添加和日期>@quarterstart。。。让我试试。谢谢你的回复!!这很好,让我找到了解决方案,请看我在正在进行的原始帖子中的咆哮,但我不得不将其更改为group by,以获取所有值。但现在还有另一个问题…@Martin Stein:我甚至不确定“按符号分组”标题id DESC是做什么的,所以我想在一个新的问题中问,你们是否有一个关于日期和符号标题id的索引?我有。一个在日期上,一个在符号\u头\u id和日期上,另一个在符号\u头\u id上。这会改变他们查询的计算方式吗?你有关于日期和符号\u头\u id的索引吗?我有。一个在日期上,一个在符号\u头\u id和日期上,另一个在符号\u头\u id上。这会改变他们查询的计算方式吗?