从输入的日期时间集中选择日期时间最近的行

时间:2019-02-04 16:42:20

标签: sql postgresql

我有一个包含数千行的表,我只对少数几个日期时间最接近一组输入日期时间的表感兴趣。

执行此查询是否有更高效的方法?

(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)

Wikipedia

2 个答案:

答案 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)上的索引将具有合理的性能-但是您的版本也应使用此类索引也具有合理的性能。