SQL - 如何有效地选择多个最接近的时间序列数据点

时间:2015-08-22 14:23:57

标签: mysql sql

我有一个简单的表data来记录列recorded_at DateTime和value整数的数据流。数据不是定期分发的,每分钟可能有多行,或者几小时都没有。

如果我想选择单个值,此查询可以很好地满足我的需要,选择最接近的搜索结果:

select * from data where recorded_at > '2015-01-01 01:01:01' limit 1

但是,除了使用重复的上述查询的并集之外,我无法找到一种有效的方法来选择最接近多个搜索日期的行,如果我想选择几百个点,则会创建一个巨大的查询。例如,如果我想要最靠近' 2015-01-01 01:01:01'还有' 2015-02-02 02:02:02'

有没有更好的方法来实现这一目标?

基本上我之后的伪查询是:

select * from data where recorded_at NEAR (date1, date2, date3) NEAR的工作方式与IN类似,但更模糊,因为我事先并不知道确切的日期。

3 个答案:

答案 0 :(得分:1)

您需要按

进行订购
foo

这是在OP编辑他的问题后编辑的

如果您想拥有多个日期并希望获得每个日期的最接近日期,我建议您使用包含所有搜索日期的查找表并尝试以下操作。 keycol是表数据中的唯一列

select * from data 
where recorded_at > '2015-01-01 01:01:01' and recorded_at < '2015-01-02 01:01:01' 
order by recorded_at limit 1

答案 1 :(得分:1)

获得多个积分:

select d.* 
from data d
where recorded_at > '2015-01-01 01:01:01'
order by recorded_at
limit 100

要有效地获取它们,请在data(recorded_at)

上创建索引
create index idx_data_recorded_at on data(recorded_at);

此外,union可能可以帮助您解决问题。虽然没有limit的{​​{1}}不能保证返回任何特定的行,但它通常会一遍又一遍地返回同一行。

编辑(基于问题编辑):

对于多个日期,这会变得有点困难。您可能最好使用order by

union all

虽然很复杂,但每个子查询都应该使用正确的索引非常快,因此整个查询应该非常快。

答案 2 :(得分:0)

以下查询选择最接近每个日期的日期:

3D(.*)&sa