我正在运行一个查询,查找记录,并在一段时间后查找另一条记录。PostgreSQL时间戳 - 索引
表定义:
(
id integer primary key,
gpsstatus character(2),
datetime timestamp without time zone,
lat numeric(9,6),
lon numeric(9,6),
alt numeric(9,4),
time integer,
datafileid integer,
shape geometry,
speed double precision,
dist double precision,
shape_utm geometry,
lokalitet character(128),
cowid integer
)
上有形状和shape_utm有关日期时间,lokalitet,cowid,gpsstatus,要旨索引的索引。
的问题应该每5秒取样,所以我试图做
select <something more>,p1.timestamp
from table p1, table p2
where p1.timestamp + interval '5 secound' = p2.timestamp
跑相当快,但后来我发现,我已经在采样因抖动而失去了不少分,所以这些点可以相距4到6秒。
然后我尝试:
where (p2.timestamp, interval'0 second')
overlaps (p1.timestamp + interval '4 second', interval '2 second')
,要花的年龄。我也尝试了更简单的解决方案:
WHERE p1.timestamp + interval '4 second' <= p2.timestamp
AND p1.timestamp + interval '6 second' >= p2.timestamp
这也最终导致无法缓慢。
时间戳字段有一个正常的索引。有没有一种特殊的索引是可以使这个查询可用的其他东西?
此刻查询:
SELECT
p1.cowid,
p1.datetime,
st_distance(p1.shape_utm, lead(p1.shape_utm)
OVER (ORDER BY p1.datetime)) AS meters_obs,
st_distance(p1.shape_utm, lead(p1.shape_utm, 720)
OVER (ORDER BY p1.datetime)) AS meters_hour,
observation.observation
FROM (gpspoint p1 LEFT JOIN observation
ON (observation.gpspointid = p1.id)),
status
WHERE p1.gpsstatus = status.id
AND status.use = true;
我也可以通过询问一些特定的时间间隔得到一个可接受的查询时间。
只有三种可能性,4或5或6秒?或者也可能有小数秒? –
可以有更多的记录不想在第一个和第二个记录之间检索?如果没有,只需要检索时间戳高于第一个记录的较早的那个。 – Pablo
@Mark Byers:只有三种可能性,时间戳被截断为秒。 - 是的,我刚刚发现,使用链接的ors或in()的运行速度要快得多,尽管sql变得非常难看...... – MortenSickel