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

标签 mysql sql

我有一个简单的表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 bylimit 不能保证返回任何特定行,但它通常会一遍又一遍地返回同一行。

编辑(基于问题编辑):

对于多个日期,这会变得有点困难。您可能最好使用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/

相关文章:

mysql - 获取 mysql 表上的共同好友

mysql - 我应该转义存储在 mysql 数据库中的代码还是使用占位符?

php - 按列对表格中的数据进行排序

php - mysql查询只选择第一条记录

sql - Spark.sql() 的 REGEXP_REPLACE

sql - 在 postgresql 中更新具有不同值的所有重复行

mysql - 为mysql中每个不同值的每个数据类型选择几个最大类型

SQL Server : Find most popular category of products bought per user for use in subquery

MySQL 过程 - 开始工作

sql - 如何设计从行创建动态列的查询