我有一个简单的表data
来记录数据流,其中包含列recorded_at
DateTime和value
Integer。数据不是定期分布的,每分钟可能有多行,或者几个小时都没有。
如果我想选择单个值,此查询非常适合我的目的,选择比我搜索的位置更接近的结果:
从记录的数据中选择 * > '2015-01-01 01:01:01' limit 1
但是,除了使用重复上述查询的并集之外,我找不到一种有效的方法来选择与多个搜索日期最接近的单个行,如果我想选择数百个点,这会创建一个巨大的查询。例如,如果我想要最接近“2015-01-01 01:01:01”和“2015-02-02 02:02:02”的单行。
有没有更好的方法来实现这一点?
基本上我想要的伪查询是:
从 Recorded_at NEAR (date1, date2, date3) 的数据中选择 *
其中 NEAR 的工作方式与 IN 类似,但更模糊,因为我事先不知道确切的日期。
最佳答案
要获得多个积分:
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);
此外,工会
可能不会帮助您的事业。尽管没有 order by
的 limit
不能保证返回任何特定行,但它通常会一遍又一遍地返回同一行。
编辑(基于问题编辑):
对于多个日期,这会变得有点困难。您可能最好使用union all
:
(select d.*
from data d
where recorded_at > '2015-01-01 01:01:01'
order by recorded_at
limit 1
) union all
(select d.*
from data d
where recorded_at > '2015-02-01 01:01:01'
order by recorded_at
limit 1
)
尽管很复杂,但每个子查询在正确的索引下都应该非常快,因此整体查询应该相当快。
关于mysql - SQL-如何有效地选择多个最接近的时间序列数据点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32157182/