我有一个简单的表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类似,但更模糊,因为我事先并不知道确切的日期。
答案 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