我有一个包含数千行的表,我只对少数几个日期时间最接近一组输入日期时间的表感兴趣。
执行此查询是否有更高效的方法?
(select * from table1
where datetime >=
to_timestamp('2015-12-31 14:30:00','YYYY-MM-DD HH24:MI:SS')
limit 1)
union all
(select * from table1
where datetime >=
to_timestamp('2015-12-31 20:30:00','YYYY-MM-DD HH24:MI:SS')
limit 1)
答案 0 :(得分:0)
要使用UNION
来添加新数据集,但已相交的部分除外。间隔为datetime >= timestamp'2015-12-31 14:30:00'
的数据集已包含从间隔datetime >= timestamp'2015-12-31 20:30:00'
返回的数据集。因此,无需针对您的情况使用UNION
,只需使用以下查询即可:
select *
from table1
where datetime >= timestamp'2015-12-31 14:30:00'
答案 1 :(得分:0)
您可以使用横向联接(在Postgres 9.3+中)简化逻辑:
select v.ts, t1.*
from (values (to_timestamp('2015-12-31 14:30:00', 'YYYY-MM-DD HH24:MI:SS')),
(to_timestamp('2015-12-31 20:30:00', 'YYYY-MM-DD HH24:MI:SS'))
) v(ts) cross join lateral
(select t1.*
from table1 t1
where t1.datetime >= v.ts
order by v.ts asc
limit 1
) t1;
我认为使用table1(timestamp)
上的索引将具有合理的性能-但是您的版本也应使用此类索引也具有合理的性能。