2012-05-15 127 views
3

我正在运行一个查询,查找记录,并在一段时间后查找另一条记录。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; 

我也可以通过询问一些特定的时间间隔得到一个可接受的查询时间。

+0

只有三种可能性,4或5或6秒?或者也可能有小数秒? –

+0

可以有更多的记录不想在第一个和第二个记录之间检索?如果没有,只需要检索时间戳高于第一个记录的较早的那个。 – Pablo

+1

@Mark Byers:只有三种可能性,时间戳被截断为秒。 - 是的,我刚刚发现,使用链接的ors或in()的运行速度要快得多,尽管sql变得非常难看...... – MortenSickel

回答

6

如果你只是想以前的记录,你可以这样做:

SELECT p, LAG(p) OVER (ORDER BY timestamp) AS pp 
FROM table p 
ORDER BY 
     timestamp 

如果你之前的当前需要记录46秒,使用此:

SELECT p1.*, p2.* 
FROM table p1 
LEFT JOIN 
     table p2 
ON  p2.timestamp BETWEEN p1.timestamp - '4 seconds'::INTERVAL 
         AND p1.timestamp - '6 seconds'::INTERVAL 
ORDER BY 
     p1.timestamp 

这可能返回多个以前的记录,如果他们都在范围内。

+0

谢谢!在这里很新,我仍然无法给你+1的答案。我会在稍后回来:-) – MortenSickel

+0

@MortenSickel:我会借给+1手。 –

+0

虽然,事实证明,BETWEEN ...并使表演再次无法使用......(但是,我在那里学到了一些非常有用的技巧)数据库有大约300万行,我要提取7000到10000其中。所有相关字段都被索引。 – MortenSickel