2012-05-15 170 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